当前位置: 首页 > 知识库问答 >
问题:

JSR-303错误未通过使用@Valid注释本机检测到

秦博达
2023-03-14

为什么@Valid注释不能本地捕获我的JSR-303注释,而是使用以下方法捕获它们:

网络配置。JAVA

@Bean
public ResourceBundleMessageSource messageSource() {

    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();

    String[] strBaseNames = {
            "resources.messages.layout.LayoutResources",
            "resources.messages.layout.MenuResources",
            "resources.messages.global.GlobalResources"
    };

    messageSource.setUseCodeAsDefaultMessage(true);
    messageSource.setDefaultEncoding("UTF-8");
    messageSource.setBasenames(strBaseNames);

    return messageSource;
}

@Bean
public LocalValidatorFactoryBean jsr303Validator() {

    LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
    localValidatorFactoryBean.setValidationMessageSource(this.messageSource());

    return localValidatorFactoryBean;
}

UserController.java

@Controller
@RequestMapping(value = "/security/user", method = RequestMethod.GET)
public class UserController {

@Autowired
private SecurityService securityService;

@Autowired
SessionObject sessionObject;

@Autowired 
@Qualifier("jsr303Validator") Validator validator;

@RequestMapping(value = "/edit/validate", method = RequestMethod.POST)
public String validateEdit( @ModelAttribute @Valid User user,
                            BindingResult result,
                            Model model) {

    String strViewName = "common/error";

    validator.validate(user, result);

    if(result.hasErrors()) {
        strViewName = "user/userEdit";
    } else {
        ... update work ...
        strViewName = "user/success";
    }

    return strViewName;
}

资源:http://www.wenda.io/questions/2462924/convert-jsr-303-validation-errors-to-springs-bindingresult.html

如果我只使用@Valid注释,result.has错误()总是空的,所以我最终会有一个约束违反异常(见下文),这是意料之中的。但是我想让它只使用@Valid注释工作,而不必在每个控制器中自动安装我的jsr303验证器bean我想实现一些JSR-303验证。

约束违反日志跟踪

Caused by: javax.validation.ConstraintViolationException: Validation failed for classes [spring4base.model.security.User] during update time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='error.firstname.notnull', propertyPath=strFirstName, rootBeanClass=class spring4base.model.security.User, messageTemplate='error.firstname.notnull'}
ConstraintViolationImpl{interpolatedMessage='error.userid.notnull', propertyPath=strUserId, rootBeanClass=class spring4base.model.security.User, messageTemplate='error.userid.notnull'}
ConstraintViolationImpl{interpolatedMessage='error.lastname.notnull', propertyPath=strLastName, rootBeanClass=class spring4base.model.security.User, messageTemplate='error.lastname.notnull'}

]

使用者JAVA

@NotBlank(message = "error.userid.notnull")
@Size(min = 0, max = 14, message = "error.firstname.length")
private String strUserId = "";

@NotBlank(message = "error.firstname.notnull")
@Size(min = 0, max = 50, message = "error.firstname.length")
private String strFirstName = "";

@NotBlank(message = "error.lastname.notnull")
@Size(min = 0, max = 50, message = "error.lastname.length")
private String strLastName = "";

非常感谢。

共有1个答案

马朝斑
2023-03-14

为了使其在我的案例中发挥作用,需要以下几点:

首先,在我的JavaConfig类(WebAppContext.java)中定义一个LocalValidatorFactoryBean。

@Bean
public ResourceBundleMessageSource messageSource() {

    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();

    String[] baseNames = {
            "resources.messages.layout.LayoutResources",
            "resources.messages.layout.MenuResources",
            "resources.messages.option.AppConfigResources",
            "resources.messages.global.GlobalResources",
            "resources.messages.contact.ContactResources",
            "resources.messages.currentsession.CurrentSessionResources",
            "resources.messages.welcome.WelcomeResources",
            "resources.messages.user.UserResources",
            "resources.messages.role.RoleResources",
            "resources.messages.profile.ProfileResources"
    };

    messageSource.setCacheSeconds(60);
    messageSource.setFallbackToSystemLocale(false);
    messageSource.setUseCodeAsDefaultMessage(true);
    messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
    messageSource.setBasenames(baseNames);

    return messageSource;
}


@Bean
public LocalValidatorFactoryBean jsr303Validator() {

    LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
    localValidatorFactoryBean.setValidationMessageSource(this.messageSource());

    return localValidatorFactoryBean;
}

然后,在我的控制器中,我像这样自动连接验证器:

@Autowired
private Validator jsr303Validator;

然后,我发现执行JSR-303的唯一方法是手动启动它们,如下所示:

@RequestMapping(value = "/update",  method = RequestMethod.POST)
public String processUpdate(@ModelAttribute UserForm userForm,
                            BindingResult result,
                            RedirectAttributes redirectAttributes,
                            SessionStatus status) throws CheckedPersistenceException {

    this.userFormValidator.validate(userForm, result);

    if (!result.hasErrors()) {
        this.jsr303Validator.validate(userForm, result);
    }

    if(result.hasErrors()) {
        return this.UPDATE_VIEW;
    }

    ...
}
 类似资料:
  • JSR 303@Valid注释可用于验证控制器方法的输入对象,如Mkyong上所示。通用域名格式 是否可以使用@Valid annotation来验证int和long[]等基元类型?如果是,怎么做? 下面是一个Spring MVC方法签名示例,需要验证参数是否大于0:

  • 使用JSR-303注释在上下文启动时验证Springbean是否有一种简单的方法?我继承了一些将配置表示为JSR-303注释POJO的类。这些都是在对象层次结构中传递的,所以我一直在使用它们。 我可以想象定义bean来设置这样一个类的属性,然后在上下文启动时运行JSR-303验证器,以确保正确设置所有值。 请注意,我不是在问SpringMVC中绑定表单提交的验证问题。

  • 问题内容: 我有如下测试: 具有以下输出: 但是,我希望注释可以被覆盖,并且不会出现警告。 有没有办法做到这一点? 编辑:我发现一个错误似乎与此有关,但我最终运行4.2.0,仍然得到上述行为。 问题答案: 实际上,JSR-303不支持覆盖验证注释。相反,子类中重写方法的注释将 累积 应用:从规范的3.3节开始:

  • 问题内容: 我刚刚开始测试JSR-303 Bean验证,并且想知道是否有可能。我们的应用程序中有一个用于所有String字段的默认正则表达式。如果我想使用bean验证来应用此功能,我想我需要在表单对象中注释每个字段。 一击是否可以将@Pattern应用于所有字符串(或某些字段)?我们正在WebLogic 10.3.4上使用Hibernate实现,并以JSF2.0为前端。验证应该独立于视图,因为我可

  • 我们正在开发REST服务,并希望使用JSR303进行输入数据验证,但这里的问题是所有模型对象都是从groovy DSL生成的,并将作为jars导入。因此,在对象字段之上编写JSR-303注释没有灵活性。 那么,有没有其他方法可以不用注释使用JSR-303,可以通过XML配置吗?或者在这种情况下,请提供任何验证建议。 谢啦

  • 问题内容: 我的主要课程是 控制器 JSP页面 为什么对象字段未通过AddressForm验证? 请帮忙。 问题答案: 您需要用注解装饰的成员。请参阅《JSR 303:Bean验证》的 3.1.3和3.5.1节。正如我在对问题“ 是否存在使用注释方法启用JSR 303 Bean验证的标准方法”的 回答中所解释的那样,这是根据JSR 303 真正使用注释的方式。 编辑 示例代码:Hibernate