两种使用Spring 3验证的方法?

时间:2012-04-03 12:38:34

标签: spring validation spring-3

我想使用Spring 3进行验证。

在参考文档中,第6.2节讨论了我们可能为要验证的类实现的Validator接口。它解释了如何创建Validator类,而不是如何验证对象。

第6.7节讨论JSR-303 API的使用以及随附的注释。它似乎是一种验证对象的不同方式(在这种情况下,使用注释而不创建Validator类)。

真的有两种方法可以使用Spring验证,或者我错过了什么?

一个简单的问题,它还规定了类路径上必须存在JSR-303 API的实现。一个提议的实施是Hibernate-Validator。 Spring是否提供了实现?

由于

2 个答案:

答案 0 :(得分:5)

是的,有两种方法:

  • 验证器接口是旧的,主要用于春季2
  • JSR 303是新的,它在构建第2版时不存在

我建议使用JSR 303. - 在我看来,使用旧验证器只有一个原因:那就是你需要大量的交叉字段验证,因为它们相对难以用JSR 303实现(但是它是可能的)

要使用JSR 303,您需要添加一个验证器实现,例如Hibernate-Validator(它是JSR 303的默认实现)(Hibernate-Validator不是Hibernate ORM!,它只是相关的)

这有点像JPA,有共同的中性规范(javax.jpa / javax.validation)和不同的提供程序实现(例如JPA:EclipseLink或Hibernate)


这是一个如何测试验证的示例(测试的目标是测试验证本身,但我将Validator更改为常用验证器),无论如何它应该向您展示如何测试验证器:

public class NotEmptyTest {

    public static class Demo {

        @NotEmpty
        String string;

        public Demo(final String string) {
            this.string = string;
        }
    }

    @Test
    public void testNotEmptysWithValid() {
        /** given: a valid object */
        Demo valid = new Demo("hallo Welt");

        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        /** then there must not be any constraint violations */
        AssertUtil.isEmpty(validator.validate(valid));
    }

    @Test
    public void testNotEmptyInValid() {
        /** given: an invalid object */
        Demo valid = new Demo("");

        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        /** then there must not be one constraint violation */
        Set<ConstraintViolation<Demo>> result = validator.validate(valid);

        AssertUtil.hasSize(1, result);
        ConstraintViolation<Demo> firstItem = result.iterator().next();
        Assert.assertEquals("{org.hibernate.validator.constraints.NotEmpty.message}",
                firstItem.getMessageTemplate());
    }
}

但是在Spring MVC Controller中它更容易,您只需要在命令对象参数中添加@Valid,并且需要在命令对象参数

之后直接添加BindingResult参数
@RequestMapping(method = RequestMethod.POST)
public ModelAndView create(@Valid UserCreateCommand userCreateCommand,
         BindingResult bindingResult) {

    if (bindingResult.hasErrors()) {
        //show form again
    } else {
        //create user and 
        //redirect To Show user
    }
}

UserCreateCommand只是一个POJO,其中的字段使用大量JSR303验证约束进行注释。

public class UserCreateCommand {

    @Length(min = 2)
    @NotBlank
    private String login;

    @Email
    @NotNull
    private String emailAddress;

    ....

    //GETTER and SETTER
}

答案 1 :(得分:0)

We can use two level of validation in spring 

1.)using annotation 
2.)using properties file

in .jsp
--------------

<style type="text/css">
.errors {
    color: red;
}


.errorblock {
    color: #000;
    background-color: #ffEEEE;
    border: 3px solid #ff0000;
    padding: 8px;
    margin: 16px;
}

</style>


<c:url value="saveUser" var="saveUser"/>
<form:form action="${saveUser}" method="post" commandName="user">
<table>
<form:errors path="*" cssClass="errorblock" element="div"></form:errors> 
<tr>
<td>User Id:</td>
<td><form:input path="userId"/>
<form:errors path="userId" cssClass="errors"></form:errors>
</td>
</tr>
<tr>
<td>Password:</td>
                <td><form:password path="password" />
                <form:errors path="password" cssClass="errors"></form:errors>
</td>
</tr>
            <tr>
                <td colspan='2'><input name="submit" type="submit"
                    value="submit" />
                </td>
            </tr>
            <tr>
                <td colspan='2'><input name="reset" type="reset" />
                </td>
            </tr>
        </table>
</form:form>


User.java
----------------------------

import org.hibernate.validator.constraints.NotEmpty;


public class User {
    @NotEmpty(message="UserId is Required")
    private String userId;
        @NotEmpty
    private String password;
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }

}

UserController.java
--------------------

@RequestMapping(value="/saveUser" ,method=RequestMethod.POST)
public String saveUser(@Valid @ModelAttribute User user,BindingResult bindingResult)
{
    System.out.println("in register"+user.getPassword());
    if(bindingResult.hasErrors())
    {
    return "register";
    }
    return "login";
}

in dispatcher-servlet.xml
--------------------------
<bean id="messageSource"
        class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames">
        <list>
                <value>message</value>
            </list>
        </property>
    </bean> 

message.properties(put this file in classpath)
---------------------
NotEmpty.user.password = password is required!