Два способа использования валидации Spring 3? - PullRequest
4 голосов
/ 03 апреля 2012

Я хочу использовать Spring 3 для проверки.

В справочной документации раздел 6.2 посвящен интерфейсу Validator, который мы можем реализовать для классов, которые мы хотим проверить.Объясняется, как создать класс Validator, но не как проверять объекты.

Раздел 6.7 посвящен использованию JSR-303 API и аннотациям, которые прилагаются.Кажется, что это другой способ проверки объектов (в данном случае, используя аннотации без создания Validator классов).

Есть ли действительно два способа использовать проверку Spring или я что-то упустил?

Один простой вопрос, также указано, что реализация JSR-303 API должна присутствовать в пути к классам.Одна из предложенных реализаций Hibernate-Validator.Предоставляет ли Spring реализацию?

Спасибо

Ответы [ 2 ]

5 голосов
/ 03 апреля 2012

Да, есть два способа:

  • Интерфейсы валидатора - это старые интерфейсы, в основном используемые весной 2
  • JSR 303 является новым, его не существует, пока весна 2 былаbuild

Я бы порекомендовал использовать JSR 303. - На мой взгляд, есть только одна причина использовать старые валидаторы: это если вам нужно МНОЖЕСТВО валидаций между полями, потому что они относительно сложныреализовать с помощью JSR 303 (но это возможно)

Чтобы использовать JSR 303, необходимо добавить реализацию валидатора, например Hibernate-Validator (это реализация по умолчанию JSR 303) (Hibernate-Validator НЕHibernate ORM !, он только связан)

Это немного похоже на JPA, есть общая нейтральная спецификация (javax.jpa / javax.validation) и различные реализации провайдера (для JPA, например: EclipseLinkили Hibernate)


Это пример того, как проверить валидацию (цель теста состояла в том, чтобы проверить саму валидацию, но я изменил Validato(в общем случае), в любом случае он должен показать вам, как проверить валидатор:

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
}
0 голосов
/ 18 апреля 2013
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!
...