Étrange exception: “le Nom ne doit pas être null ou vide!”
Je suis dans une étrange erreur dans un projet pour le Printemps, qui est le suivant:
SÉVÈRE: Servlet.service() de la servlet [calzoneServlet] dans le contexte de chemin [/calzone] a jeté exception [Demande de traitement a échoué; nested exception est org.springframework.dao.InvalidDataAccessApiUsageException: Nom ne doit pas être null ou vide!; nested exception java.lang.IllegalArgumentException: Nom ne doit pas être null ou vide!] à cause de racine
java.lang.IllegalArgumentException: Nom ne doit pas être null ou vide!
Dans ce projet, tous les modèles sont mappées à la base de données de l'utilisation d'hibernate et jpa. Le front-end de Twitter Bootstrap (avec ressort de validation de formulaire, etc)
L'erreur se produit à différentes parties du programme, dont l'une est un contrôleur pour activer un compte d'utilisateur (code ci-dessous). Pour moi, cela ressemble à une sorte d'erreur de validation, mais ce n'est pas une erreur que j'ai jamais défini. Puisque je ne peux pas repérer l'emplacement exact de l'erreur, je vais seulement donner au contrôleur ci-dessous. Il est à noter que tous les messages de débogage (que ce soit par le biais de l'enregistreur ou tout simplement un bon vieux sysout) dans le activateUser
méthode ne s'affichent pas.
Toutes les dépendances (pom.xml) peut être trouvé ici: http://pastebin.com/fs7SG0W2
Web.xml ici: http://pastebin.com/vAJh29Aw
L'ensemble de la stacktrace peut être trouvé ici: http://codepad.org/p0Yt5hi2 (sur codepad, parce qu'il a le défilement horizontal)
Quelqu'un a une idée de pourquoi cette erreur peut se produire, ou n'ont aucune idée de comment je peux savoir pourquoi il se passe?
@Controller
public class ActivateAccountController {
final Logger logger = LoggerFactory.getLogger(getClass());
@RequestMapping(value = "/activate/{keyString}", method = RequestMethod.GET)
public String activateUser(@PathVariable String keyString) {
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
KeyService keyService = (KeyService) context.getBean("keyService");
UserService userService = (UserService) context.getBean("userService");
User user;
try {
logger.error("DID I GET HERE?");
user = keyService.findUserByKey(keyString);
} catch (KeyNotFoundException ex) {
return "ActivatedNotAccount";
} finally {
//Close the application context in every case
context.close();
}
//Activate the in-memory user
userService.activateUser(user);
//Delete the key from the database
keyService.deleteKey(keyString);
//Finally, update the user in the database
userService.updateUser(user);
logger.info("Acticated user with ID \"{}\", First name: \"{}\", Last name: \"{}\" and username: \"{}\"",
user.getId(), user.getPerson().getFirstName(), user.getPerson().getLastName(), user.getUsername());
return "ActivatedAccount";
}
}
OriginalL'auteur Sam | 2014-03-30
Vous devez vous connecter pour publier un commentaire.
Votre
KeyService
est l'appel de certains Spring Data JPA référentiel avec une méthodefindKeyByKeyString()
méthode. Cette méthode est à l'origine de Spring Data JPA exploser parce que certains des paramètres de la requête est manquant.Mettre un point d'arrêt conditionnel sur
org.springframework.data.jpa.repository.query.StringQuery.getBindingFor(StringQuery.java:104)
qui correspond si!StringUtils.hasText(name)
pour voir ce qu'il se passe, ou examen de lafindKeyByKeyString()
méthode.Ne devrait pas "paramètre de requête est manquant" être une meilleure description de l'exception?
J'ai laissé par mégarde une de @Param tags sur mes requêtes. Merci pour cette réponse.
OriginalL'auteur Emerson Farrugia
MODIFIER:
@Gilbertoca souligné j'ai en effet eu à utiliser @Param. Source de ma confusion vient du fait que j'ai utilisé @QueryParam annotation par accident.
Donc, si vous utilisez @Param ça marchera.
Réponse originale:
J'ai eu exactement le même et a pris un certain temps alors que j'ai compris quel était le problème:
J'ai utilisé JpaRepository interface avec une méthode annotée comme
Comme il s'est avéré, dans ce contexte, les paramètres nommés sont pas pris en charge.
Il a commencé à travailler pour moi après que j'ai changé:
(entre parenthèses sont importants, sinon il ne fonctionne pas).
OriginalL'auteur uthomas
J'ai eu la même exception et j'ai été absent @Param("nom") dans la méthode args:
@Query("SELECT p.preferenceId.userId DE Préférence p OÙ p.preferenceId.appName = :appname")
Liste getAppUsers(@Param("nom") String nom);
OriginalL'auteur Arun Gopalpuri