Comment remplacer par programme l’Exception NumberFormatException de Spring par un texte convivial?

Je travaille sur une application Web Spring et j’ai une entité qui possède une propriété Integer que l’utilisateur peut renseigner lorsqu’il crée une nouvelle entité à l’aide d’un formulaire JSP. La méthode du contrôleur appelée par ce formulaire est la suivante:

@RequestMapping(value = {"/newNursingUnit"}, method = RequestMethod.POST) public Ssortingng saveNursingUnit(@Valid NursingUnit nursingUnit, BindingResult result, ModelMap model) { boolean hasCustomErrors = validate(result, nursingUnit); if ((hasCustomErrors) || (result.hasErrors())) { List facilities = facilityService.findAll(); model.addAtsortingbute("facilities", facilities); setPermissions(model); return "nursingUnitDataAccess"; } nursingUnitService.save(nursingUnit); session.setAtsortingbute("successMessage", "Successfully added nursing unit \"" + nursingUnit.getName() + "\"!"); return "redirect:/nursingUnits/list"; } 

La méthode validate vérifie simplement si le nom existe déjà dans la firebase database, je ne l’ai donc pas inclus. Mon problème est que, lorsque j’entre volontairement du texte dans le champ, j’aimerais envoyer un message agréable tel que “Le temps de décharge automatique doit être un nombre!”. Au lieu de cela, Spring renvoie cette erreur absolument horrible:

 Failed to convert property value of type [java.lang.Ssortingng] to required type [java.lang.Integer] for property autoDCTime; nested exception is java.lang.NumberFormatException: For input ssortingng: "sdf" 

Je comprends tout à fait pourquoi cela se produit, mais je ne peux pas pendant toute la vie comprendre comment, par programme, remplacer le message d’erreur d’exception de format de numéro par défaut de Spring par le mien. Je suis conscient des sources de message pouvant être utilisées pour ce type de choses, mais je souhaite vraiment y parvenir directement dans le code.

MODIFIER

Comme suggéré, j’ai construit cette méthode dans mon contrôleur mais je reçois toujours le message “Impossible de convertir la valeur de la propriété …” de Spring:

 @ExceptionHandler({NumberFormatException.class}) private Ssortingng numberError() { return "The auto-discharge time must be a number!"; } 

AUTRE EDIT

Voici le code de ma classe d’entité:

 @Entity @Table(name="tblNursingUnit") public class NursingUnit implements Serializable { private Integer id; private Ssortingng name; private Integer autoDCTime; private Facility facility; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Size(min = 1, max = 15, message = "Name must be between 1 and 15 characters long") @Column(nullable = false, unique = true, length = 15) public Ssortingng getName() { return name; } public void setName(Ssortingng name) { this.name = name; } @NotNull(message = "The auto-discharge time is required!") @Column(nullable = false) public Integer getAutoDCTime() { return autoDCTime; } public void setAutoDCTime(Integer autoDCTime) { this.autoDCTime = autoDCTime; } @ManyToOne (fetch=FetchType.EAGER) @NotNull(message = "The facility is required") @JoinColumn(name = "id_facility", nullable = false) public Facility getFacility() { return facility; } public void setFacility(Facility facility) { this.facility = facility; } @Override public boolean equals(Object obj) { if (obj instanceof NursingUnit) { NursingUnit nursingUnit = (NursingUnit)obj; if (Objects.equals(id, nursingUnit.getId())) { return true; } } return false; } @Override public int hashCode() { int hash = 3; hash = 29 * hash + Objects.hashCode(this.id); hash = 29 * hash + Objects.hashCode(this.name); hash = 29 * hash + Objects.hashCode(this.autoDCTime); hash = 29 * hash + Objects.hashCode(this.facility); return hash; } @Override public Ssortingng toSsortingng() { return name + " (" + facility.getCode() + ")"; } } 

ENCORE UN AUTRE ÉDIT

Je suis capable de faire cela en utilisant un fichier message.properties sur le classpath contenant ceci:

 typeMismatch.java.lang.Integer={0} must be a number! 

Et la déclaration de bean suivante dans un fichier de configuration:

 @Bean public ResourceBundleMessageSource messageSource() { ResourceBundleMessageSource resource = new ResourceBundleMessageSource(); resource.setBasename("message"); return resource; } 

Cela me donne le message d’erreur correct au lieu du Spring générique TypeMismatchException / NumberFormatException avec lequel je peux vivre mais je veux tout faire par programme chaque fois que possible et je cherche une alternative.

Merci de votre aide!

Vous pourrez peut-être remplacer cette messagerie en fournissant une implémentation de Spring DefaultBindingErrorProcessor similaire à celle DefaultBindingErrorProcessor ici: Message d’erreur de liaison personnalisée avec des collections de beans dans Spring MVC

Vous pouvez annoter une méthode avec:

 @ExceptionHandler({NumberFormatException.class}) public Ssortingng handleError(){ //example return "Uncorrectly formatted number!"; } 

et implémentez ce que vous voulez faire au cas où une exception de ce type serait levée. Le code donné gérera les exceptions survenues dans le contrôleur actuel. Pour plus de référence, consultez ce lien .

Pour gérer les erreurs globales, vous pouvez utiliser @ControllerAdvice de la manière suivante:

 @ControllerAdvice public class ServiceExceptionHandler extends ResponseEntityExceptionHandler { @ExceptionHandler({NumberFormatException.class}) public Ssortingng handleError(){ //example return "Uncorrectly formatted number!"; } } 

@Martin, je vous ai demandé @ControllerAdvice était la version, car @ControllerAdvice est disponible à partir de la version 3.2.

Je vous recommanderais d’utiliser @ControllerAdvice , une annotation qui vous permet d’écrire du code pouvant être partagé entre les contrôleurs (annoté avec @Controller et @RestController ), mais il ne peut également être appliqué qu’aux contrôleurs de packages ou de classes concrètes spécifiques.

ControllerAdvice est destiné à être utilisé avec @ExceptionHandler , @InitBinder ou @ModelAtsortingbute .

Vous définissez les classes cible comme ceci @ControllerAdvice(assignableTypes = {YourController.class, ...}) .

 @ControllerAdvice(assignableTypes = {YourController.class, YourOtherController.class}) public class YourExceptionHandler{ //Example with default message @ExceptionHandler({NumberFormatException.class}) private Ssortingng numberError(){ return "The auto-discharge time must be a number!"; } //Example with exception handling @ExceptionHandler({WhateverException.class}) private Ssortingng whateverError(WhateverException exception){ //do stuff with the exception return "Whatever exception message!"; } @ExceptionHandler({ OtherException.class }) protected Ssortingng otherException(RuntimeException e, WebRequest request) { //do stuff with the exception and the webRequest return "Other exception message!"; } } 

N’oubliez pas que si vous ne définissez pas la cible et que vous définissez plusieurs gestionnaires d’exceptions pour les mêmes exceptions dans différentes classes @ControllerAdvice , Spring appliquera le premier gestionnaire trouvé. Si plusieurs gestionnaires d’exceptions sont présents dans la même classe @ControllerAdvice , une erreur sera @ControllerAdvice .

Gérer NumberFormatException.

 try { boolean hasCustomErrors = validate(result, nursingUnit); }catch (NumberFormatException nEx){ // do whatever you want // for example : throw custom Exception with the custom message. }