Spring验证器错误代码未自动解析

时间:2017-07-13 09:49:30

标签: java spring spring-mvc localization spring-validator

消息源配置:

@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验证器:

@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.

hibernate验证器:

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

Spring控制器:

@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;
}

在我的控制器中,error.getDefaultMessage()始终显示Spring验证程序错误代码errors.reject("myAccount.id.not_found");的空值,无法自动解析。

当我尝试在上面的字段注释中看到hibernate验证器时,它工作正常,@NotNull(message="{myAccount.id.not_found}")可以在每个语言环境中自动完美解析。

我是否错过任何配置?为什么Spring验证器错误代码不能自动工作?

PS:我的I18N配置应该是正确的,我的所有JSP都可以正确显示文本。

1 个答案:

答案 0 :(得分:0)

我一整天都在寻找,可能我的问题没有答案......我总结了一些我的发现:

1)阅读大量教程,所有这些教程都在JSP视图中显示错误消息,因此他们可能会像以下一样工作:<form:errors path="*" cssClass="error" element="div"/>,错误代码将自动解析为区域设置消息。但在我的情况下,我想通过ajax获取错误消息,因此,要解决控制器中的错误代码,我必须手动执行,不幸的是我必须在我的注入messagesourcelocale控制器:

@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)读取Resolving codes to error messages,解析器将错误代码解析为一个或多个消息代码,将消息代码映射到{中的消息值没有帮助{1}}。我误解了messagesourceerror code之间的术语。

如果有人有解决方案,请分享......