2017-07-13 4 views
0

Message source config:Spring code d'erreur validateur est pas automatiquement résoudre

@Bean 
public MessageSource messageSource() { 
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 
    messageSource.setBasenames("classpath:locale/normal/message", "classpath:locale/validation/message"); 
    messageSource.setDefaultEncoding("UTF-8"); 
    return messageSource; 
} 

Spring validateur:

@Component 
public class MyAccountValidator implements Validator { 

    @Autowired 
    MyAccountService myAccountService; 

    @Override 
    public boolean supports(Class<?> clazz) {  
     return MyAccount.class.isAssignableFrom(clazz); 
    } 

    @Override 
    public void validate(Object target, Errors errors) { 

     MyAccount myAccount = (MyAccount) target; 

     MyAccount myAccountDb = myAccountService.findByUserId(myAccount.getUserId()); 

     if (myAccountDb == null) { 
      errors.reject("myAccount.id.not_found"); 
     } 
    } 
} 

message_en.properties:

myAccount.id.not_found=Your id is not found. 

mise en veille prolongée validateur:

@NotNull(message="{myAccount.id.not_found}") 
private String password; 

contrôleur de printemps:

@RequestMapping(value = { "/validate" }, method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.TEXT_HTML_VALUE) 
@ResponseBody 
public String validate(Model model, @RequestBody @Valid MyAccount myAccount, BindingResult bindingResult, Locale locale) throws JsonProcessingException { 

    System.out.println("myAccount user id = " + myAccount.getUserId()); 

    String msg = ""; 
    List<ObjectError> errors = bindingResult.getAllErrors(); 
    for (ObjectError error : errors) { 
     msg = msg + (error.getObjectName() + " - " + error.getCode() + " - " + error.getDefaultMessage()) + "\n"; 
    }      

    return msg; 
} 

Dans mon contrôleur, error.getDefaultMessage() affiche toujours la valeur NULL pour le code d'erreur validateur Spring errors.reject("myAccount.id.not_found");, il ne peut pas être résolu automatiquement.

Lorsque j'essaie le validateur d'hibernation comme vous pouvez le voir dans l'annotation de champ ci-dessus, cela fonctionne bien, @NotNull(message="{myAccount.id.not_found}") peut être résolu parfaitement dans chacun des paramètres régionaux automatiquement.

Est-ce que je n'ai aucune configuration? Pourquoi le code d'erreur du validateur Spring ne fonctionne pas automatiquement? PS: Ma configuration I18N doit être correcte, tous mes JSP peuvent afficher le texte correctement.

Répondre

0

J'ai cherché toute la journée, il n'y a probablement pas de réponse à ma question ... Je conclus certaines de mes conclusions:

1) La lecture de beaucoup de tutoriels, tous afficher le message d'erreur Vue JSP, donc ils pourraient probablement le faire fonctionner comme ceci: <form:errors path="*" cssClass="error" element="div"/>, le code d'erreur sera résolu automatiquement en message de paramètres régionaux. Mais dans mon cas, je veux faire passer le message d'erreur via ajax, donc, pour résoudre le code d'erreur dans le contrôleur, je dois le faire manuellement, je dois malheureusement injecter messagesource et locale dans mon contrôleur:

@RequestMapping(value = { "/validate" }, method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.TEXT_HTML_VALUE) 
@ResponseBody 
public String validate(Model model, @RequestBody @Valid MyAccount myAccount, BindingResult bindingResult, Locale locale) throws JsonProcessingException { 

    System.out.println("myAccount user id = " + myAccount.getUserId()); 

    String msg = ""; 
    List<ObjectError> errors = bindingResult.getAllErrors(); 
    for (ObjectError error : errors) { 
     msg = msg + (messageSource.getMessage(error, locale)) + "\n"; 
    }      

    return msg; 
} 

2) Avoir une lecture sur le Resolving codes to error messages, le résolveur doit résoudre le code d'erreur à un ou plusieurs codes de message, il n'aide pas à mapper le code de message aux valeurs de message dans le messagesource. J'ai mal compris le terme entre error code et message code.

Si quelqu'un qui a la solution, s'il vous plaît partager ...