有两个问题:
1.Sping / MVC使用hibernate验证器,自定义验证器如何显示消息? 喜欢:Cross field validation with Hibernate Validator (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。我想将组验证器与spring 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,任何注释支持组验证者按组?
第一篇文章:)
答案 0 :(得分:3)
<强>更新强>
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/spring-mvc-and-jsr-303-validation-groups/
答案 1 :(得分:1)
至于@Valid
注释中的验证组支持 - 有一种方法可以做到,我最近发现,它正在重新定义已验证bean的默认组:
@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
,但保留了验证组的顺序。
答案 2 :(得分:1)
从Spring 3.1开始,您可以使用Spring的@Validated
实现基于组的验证,如下所示:
@RequestMapping
public String doLogin(@Validated({LoginChecks.class}) LoginForm) {
// ...
}
@Validated
可替代@Valid
。
答案 3 :(得分:1)
控制器参数注释是@valid,任何注释支持组验证者按组?
现在可以使用 @ConvertGroup 注释。看看http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-group-conversion