使用Spring3验证的两种方法?

使用Spring3验证的两种方法?,spring,validation,spring-3,Spring,Validation,Spring 3,我想使用Spring3进行验证 在参考文档中,第6.2节讨论了我们可能为要验证的类实现的验证程序接口。它解释了如何创建验证程序类,但没有解释如何验证对象 第6.7节介绍了JSR-303API的使用以及随附的注释。这似乎是验证对象的另一种方式(在本例中,使用注释而不创建Validator类) 使用Spring验证真的有两种方法吗?或者我遗漏了什么 一个简单的问题,它还指定类路径上必须存在JSR-303API的实现。一个建议的实现是Hibernate验证器。Spring是否提供了一个实现 谢谢是的,

我想使用Spring3进行验证

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

第6.7节介绍了
JSR-303
API的使用以及随附的注释。这似乎是验证对象的另一种方式(在本例中,使用注释而不创建
Validator
类)

使用Spring验证真的有两种方法吗?或者我遗漏了什么

一个简单的问题,它还指定类路径上必须存在
JSR-303
API的实现。一个建议的实现是
Hibernate验证器
。Spring是否提供了一个实现


谢谢

是的,有两种方法:

  • 验证器接口是旧的,主要用于Spring2
  • JSR303是新的,它在构建Spring2时不存在
我建议使用JSR303。-在我看来,使用旧的验证器只有一个原因:那就是如果您需要大量跨域验证,因为它们相对难以用JSR303实现(但这是可能的)

要使用JSR303,您需要添加一个验证器实现,例如HibernateValidator(它是JSR303的默认实现)(HibernateValidator不是HibernateORM!,它只是相关的)

这有点像JPA,有共同的中立规范(javax.JPA/javax.validation)和不同的提供者实现(对于JPA,例如EclipseLink或Hibernate)


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

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());
    }
}
UserCreateCommand只是一个POJO,其中字段用大量JSR303验证约束进行注释

public class UserCreateCommand {

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

    @Email
    @NotNull
    private String emailAddress;

    ....

    //GETTER and SETTER
}
我们可以在spring中使用两级验证
1.)使用注释
2.)使用属性文件
jsp
--------------
.错误{
颜色:红色;
}
.errorblock{
颜色:#000;
背景色:#ffEEEE;
边框:3倍实心#ff0000;
填充:8px;
利润率:16px;
}
用户Id:
密码:
User.java
----------------------------
导入org.hibernate.validator.constraints.NotEmpty;
公共类用户{
@NotEmpty(message=“UserId是必需的”)
私有字符串用户标识;
@空空如也
私有字符串密码;
公共字符串getPassword(){
返回密码;
}
public void setPassword(字符串密码){
this.password=密码;
}
公共字符串getUserId(){
返回用户标识;
}
public void setUserId(字符串userId){
this.userId=userId;
}
}
UserController.java
--------------------
@RequestMapping(value=“/saveUser”,method=RequestMethod.POST)
公共字符串saveUser(@Valid@modeldattribute User User,BindingResult BindingResult)
{
System.out.println(“in register”+user.getPassword());
if(bindingResult.hasErrors())
{
返回“登记簿”;
}
返回“登录”;
}
在dispatcher-servlet.xml中
--------------------------
消息
属性(将此文件放入类路径)
---------------------
NotEmpty.user.password=需要密码!

谢谢你的回答。您能提供一个简单的示例,其中包含一个域类及其相应的单元测试吗?我想知道如何设置Spring来验证这个类。非常感谢你的帮助。谢谢你的例子。在NotEmptyTestClass中,您可以在应用程序上下文中声明LocalValidatorFactoryBean,对吗?然后,我需要从这个验证器工厂获得一个验证器。然后,如果我在UserCreateCommand实例上调用validate方法,后者将根据放在其上的JSR-303注释进行验证?(我没有使用MVC,所以我不知道它在一般情况下是如何工作的)。我不完全理解最后的评论。但是测试在没有Spring的情况下工作(这意味着:没有Spring上下文)!另一方面,应该可以将验证器注入任何Springbean。重要的一点是“Springbean”,并不是每个类都是Springbean。在我的示例中,控制器是唯一一个Springbean。(也许您应该看看“@Configurable”)。按照您提供的示例,假设UserCreateCommand是我的域类之一。它使用JSR-303注释进行注释。我想知道如何验证这个类?我从您的示例中了解到,要验证类,我需要调用验证器的validate方法(以前使用ValidatorFactory获得,例如LocalValidatorFactoryBean)。我说得对吗?是的如果您希望这个类本身就是验证,那么您必须解决的唯一问题就是将它变成一个Springbean这就是为什么我用
@Configurable
public class UserCreateCommand {

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

    @Email
    @NotNull
    private String emailAddress;

    ....

    //GETTER and SETTER
}
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!