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

Posted

技术标签:

【中文标题】Spring验证器错误代码不是自动解析【英文标题】:Spring validator error code is not auto resolve 【发布时间】:2017-12-18 00:41:14 【问题描述】:

消息源配置:

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

弹簧验证器:

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

休眠验证器:

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

弹簧控制器:

@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"); 的空值,无法自动解决。

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

我会错过任何配置吗?为什么 Spring 验证器错误代码无法自动工作?

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

【问题讨论】:

您可能还没有配置 LocalValidatorFactoryBean。你可以看看这里:***.com/questions/45692179/… 【参考方案1】:

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

1) 看了很多教程,都在 JSP 视图中显示错误消息,所以他们大概可以这样工作:&lt;form:errors path="*" cssClass="error" element="div"/&gt;,错误代码会自动解析为语言环境消息。但就我而言,我想通过 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,解析器是将错误代码解析为一个或多个消息代码,将消息代码映射到messagesource 中的消息值无济于事。我误解了error codemessage code 之间的术语。

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

【讨论】:

以上是关于Spring验证器错误代码不是自动解析的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 验证错误代码在哪里解决?

通过 Spring Security 的 Active Directory 身份验证返回由 LDAP 引起的有效用户的错误凭据:错误代码 49

Spring boot Ldap 身份验证失败,LDAP 错误代码 49 - 80090308 数据 52e

通过spring security进行的Active Directory身份验证会返回由LDAP引起的有效用户的错误凭据:错误代码49

说明:depot 无法解析或不是字段

CSS3 calc() 验证:值错误:宽度解析错误 [重复]