Spring MVC с Hibernate Validator. Как проверить имущество по группе? - PullRequest
8 голосов
/ 04 августа 2011

Существуют две проблемы:

1.Sping / MVC использует средство проверки подлинности hibernate, Пользовательский средство проверки подлинности, как показать сообщение? подобно: Проверка перекрестного поля с помощью средства проверки Hibernate (JSR 303)

@FieldMatch.List({
    @FieldMatch(fieldName="password",verifyName="passwordVerify",message="password confirm valid!", groups={Default.class})
})
@ScriptAssert(lang="javascript",script="_this.name.equals(_this.verifyCode)")
public class LoginForm {...}

Как показать сообщение в jsp с файлом свойств ресурса?

NotEmpty.loginForm.name = "имя пользователя не может быть пустым!"NotEmpty.loginForm.password = "пароль не может быть пустым!"

2.Я хочу использовать валидатор группы с пружинным mvc, например одну пользовательскую форму для входа в систему и регистрации

    @FieldMatch.List({
    @FieldMatch(fieldName="password",verifyName="passwordVerify",message="password confirm valid!", groups={Default.class})
})@ScriptAssert(lang="javascript",script="_this.name.equals(_this.verifyCode)",groups={Default.class,LoginChecks.class,RegisterChecks.class})
public class LoginForm {
    @NotEmpty(groups={Default.class,LoginChecks.class,RegisterChecks.class})
    @Size(min=3,max=10,groups={LoginChecks.class,RegisterChecks.class})
    private String name;

    @NotEmpty(groups={Default.class,LoginChecks.class,RegisterChecks.class})
    @Size(max=16,min=5,groups={LoginChecks.class,RegisterChecks.class})
    private String password;

    private String passwordVerify;

    @Email(groups={Default.class,LoginChecks.class,RegisterChecks.class})
    private String email;

    private String emailVerify;
...
}

Примечание к параметру контроллера равно @valid, любой валидатор группы поддержки аннотаций по группе?

Первый пост:)

Ответы [ 4 ]

3 голосов
/ 04 августа 2011

Обновление:

Spring 3.1 предоставляет аннотацию @Validated, которую можно использовать в качестве замены для @Valid, и она принимает группы. Если вы используете Spring 3.0.x, вы все равно можете использовать код в этом ответе.

Оригинальный ответ:

Это определенно проблема. Поскольку аннотация @Valid не поддерживает группы, вам придется выполнить проверку самостоятельно. Вот метод, который мы написали для выполнения проверки и сопоставления ошибок с правильным путем в BindingResult. Это будет хороший день, когда мы получим аннотацию @Valid, которая принимает группы.

 /**
 * Test validity of an object against some number of validation groups, or
 * Default if no groups are specified.
 *
 * @param result Errors object for holding validation errors for use in
 *            Spring form taglib. Any violations encountered will be added
 *            to this errors object.
 * @param o Object to be validated
 * @param classes Validation groups to be used in validation
 * @return true if the object is valid, false otherwise.
 */
private boolean isValid( Errors result, Object o, Class<?>... classes )
{
    if ( classes == null || classes.length == 0 || classes[0] == null )
    {
        classes = new Class<?>[] { Default.class };
    }
    Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation<Object>> violations = validator.validate( o, classes );
    for ( ConstraintViolation<Object> v : violations )
    {
        Path path = v.getPropertyPath();
        String propertyName = "";
        if ( path != null )
        {
            for ( Node n : path )
            {
                propertyName += n.getName() + ".";
            }
            propertyName = propertyName.substring( 0, propertyName.length()-1 );
        }
        String constraintName = v.getConstraintDescriptor().getAnnotation().annotationType().getSimpleName();
        if ( propertyName == null || "".equals(  propertyName  ))
        {
            result.reject( constraintName, v.getMessage());
        }
        else
        {
            result.rejectValue( propertyName, constraintName, v.getMessage() );
        }
    }
    return violations.size() == 0;
}

Я скопировал этот источник из своей записи в блоге относительно нашего решения. http://digitaljoel.nerd -herders.com / 2010/12/28 / весна-MVC-и-JSR-303-валидация-групп /

1 голос
/ 07 августа 2013

Значение параметра контроллера - @valid, есть ли валидатор группы поддержки аннотаций по группам?

Теперь это возможно с @ ConvertGroup аннотацией. Проверьте это http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-group-conversion

1 голос
/ 22 апреля 2013

Начиная с версии Spring 3.1, вы можете достичь групповой проверки с помощью @Validated Spring следующим образом:

@RequestMapping
public String doLogin(@Validated({LoginChecks.class}) LoginForm) {
    // ...
}

@Validated является заменой @Valid.

1 голос
/ 17 октября 2011

Что касается поддержки групп проверки внутри аннотации @Valid - есть способ сделать это, который я недавно нашел, это переопределение группы по умолчанию для проверенного компонента:

@GroupSequence({TestForm.class, FirstGroup.class, SecondGroup.class})
class TestForm {

    @NotEmpty
    public String firstField;

    @NotEmpty(groups=FirstGroup.class)
    public String secondField; //not validated when firstField validation fails

    @NotEmpty(groups=SecondGroup.class)
    public String thirdField; //not validated when secondField validation fails
}

Теперь вы все еще можете использовать @Valid, сохраняя при этом порядок с группами проверки.

...