java - Spring MVC - 带注释的约束验证 - 不显示错误消息

标签 java spring spring-mvc spring-roo thymeleaf

我希望能够在网络界面中显示我的实体字段约束验证错误

例如,我在我的实体上定义了以下约束:

@RooJavaBean
@RooToString
@RooJpaActiveRecord
public class Member {

    @NotNull
    @Email
    @Column(unique = true)
    private String email;

    private String pseudo;

    @NotNull
    @Size(min = 6)
    private String password;

    @NotNull
    @Size(min = 2)
    private String firstName;

    @NotNull
    @Size(min = 2)
    private String lastName;

    @Temporal(TemporalType.DATE)
    @DateTimeFormat(pattern = "dd/MM/yyyy")
    private Date dateOfBirth;

    @NotNull
    @Enumerated
    private Orientation orientation;

    @NotNull
    private String token;

    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(pattern = "dd/MM/yyyy")
    private Date registrationDate;

    private boolean activated;
}

我还定义了一个我在 spring mvc Controller 中使用的 helper javabean;这是:

@RooJavaBean
public class RegistrationInfo {

    private Member member;

    private String passwordConfirmation;

}

下面是我的spring mvc Controller 中的相关代码:

@RequestMapping(value = "/registration", method = RequestMethod.POST, produces = "text/html")
public String registerMember(@ModelAttribute("registrationInfo") @Valid RegistrationInfo registrationInfo, Model model, BindingResult bindingResult) {
    if (!registrationInfo.getMember().getPassword().equals(registrationInfo.getPasswordConfirmation())) {
        bindingResult.addError(new ObjectError("member.password", "passwords don't match"));
    }
    if (!registrationService.isEmailAvailable(registrationInfo.getMember().getEmail())) {
        bindingResult.addError(new ObjectError("member.email", "email already used"));
    }
    if (bindingResult.hasErrors()) {
        //HOW TO ADD BEAN CONSTRAINTS VALIDATION ERRORS HERE????
        populateForm(model, registrationInfo);
        return "registration";
    }
    registrationService.registerMember(registrationInfo.getMember());
    return "redirect:/";
}

从我的用户界面:

<div id="errors">
            <ul th:if="${#fields.hasErrors('*')}">
                <li th:each="err : ${#fields.errors('*')}" th:text="${err}"></li>
            </ul>
        </div>

但是,按照现在的情况,将要显示的唯一错误是我手动添加的错误(例如 bindingResult.addError)...

有人可以提供建议吗?

编辑:如果我用 @Valid 注释 member 变量,我在验证表单时得到这个异常:

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 5 errors
Field error in object 'registrationInfo' on field 'member.password': rejected value []; codes [Size.registrationInfo.member.password,Size.member.password,Size.password,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [registrationInfo.member.password,member.password]; arguments []; default message [member.password],2147483647,6]; default message [la taille doit �tre entre 6 et 2147483647]
Field error in object 'registrationInfo' on field 'member.firstName': rejected value []; codes [Size.registrationInfo.member.firstName,Size.member.firstName,Size.firstName,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [registrationInfo.member.firstName,member.firstName]; arguments []; default message [member.firstName],2147483647,2]; default message [la taille doit �tre entre 2 et 2147483647]
Field error in object 'registrationInfo' on field 'member.token': rejected value [null]; codes [NotNull.registrationInfo.member.token,NotNull.member.token,NotNull.token,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [registrationInfo.member.token,member.token]; arguments []; default message [member.token]]; default message [ne peut pas �tre nul]
Field error in object 'registrationInfo' on field 'member.registrationDate': rejected value [null]; codes [NotNull.registrationInfo.member.registrationDate,NotNull.member.registrationDate,NotNull.registrationDate,NotNull.java.util.Date,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [registrationInfo.member.registrationDate,member.registrationDate]; arguments []; default message [member.registrationDate]]; default message [ne peut pas �tre nul]
Field error in object 'registrationInfo' on field 'member.lastName': rejected value []; codes [Size.registrationInfo.member.lastName,Size.member.lastName,Size.lastName,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [registrationInfo.member.lastName,member.lastName]; arguments []; default message [member.lastName],2147483647,2]; default message [la taille doit �tre entre 2 et 2147483647]
    org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:111)
    org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:75)
    org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:156)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:147)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

最佳答案

@Valid 添加到RegistrationInfo 中的member 属性:

@RooJavaBean
public class RegistrationInfo {

    private @Valid Member member;

    private String passwordConfirmation;

}

然后在你的 Controller 方法中,bindingResult 必须在 registrationInfo 之后:

public String registerMember(@ModelAttribute("registrationInfo") @Valid RegistrationInfo registrationInfo,
BindingResult bindingResult, Model model) {

关于java - Spring MVC - 带注释的约束验证 - 不显示错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12237159/

相关文章:

Java 配置中忽略 Spring MVC HandlerInterceptor

java - Eclipse 声明的包与预期的包不匹配

用于解析 Action 文件的java框架

WLP (WebSphere Liberty) 上的 Spring Boot 部署抛出 CWWKC0044W 错误

java - Spring MVC i18n 验证错误消息

java - Spring MVC 中的@Named 注解

java - 在 Spring/Hibernate 环境中手动管理数据库事务

java - 计算两个版本之间的代码行数

java - Spring Boot中使用@autowire注解重载构造函数

java - spring.cloud.stream.source 到底做了什么?