我正在使用spring mvc 3.0创建一个演示应用程序。我必须通过screen.I在网上进行验证,发现主要有两种类型的验证与应用: -Spring验证与使用注释的Hibernate验证
- 春天验证使用验证阿比
- 使用Hibernate验证休眠验证
希望有人给我哪一个是在应用程序中实现一个良好的建议。
我正在使用spring mvc 3.0创建一个演示应用程序。我必须通过screen.I在网上进行验证,发现主要有两种类型的验证与应用: -Spring验证与使用注释的Hibernate验证
希望有人给我哪一个是在应用程序中实现一个良好的建议。
我使用了两个 - 我喜欢Hibernate验证更多 - 很容易实现和相当标准。当你在类路径上有一个实现时它会自动启用。这里是一个例子:
@EmailValidator
@NotBlank
@Length(max=65)
private String email;
消息错误字符串从哪里来?在WEB-INF你必须有一个名为messages.properties:
NotBlank.ForgotPasswordBackingObject.email=Email address must be present
有一个标准@Email注释,但一个电子邮件,例如:我@ myCompany的被认为有效,这就是为什么我必须让我的自己的@EmailValidator(在标准实现中将正则表达式标志从*更改为+)。 有迹象表明,我碰到一些问题:验证顺序 - 你想先发生,这与确认团组做哪些验证,但这是不可能的@Valid注释,例如:
@RequestMapping(method=RequestMethod.POST, value="/auth/changePassword")
public ModelAndView submitChangePasswordPage(@Valid @ModelAttribute("ChangePasswordBackingObject") ChangePasswordBackingObject backingObject, BindingResult result, Principal principal)
这就是为什么如果你有这种形式的Controller(例如Spring MVC),那么你必须以某种方式模拟你的逻辑 - 我也这样做了。
,你可以这样做是为了在验证两个或多个字段的时间(我发现非常有用的)另一个很酷的事情:
@FieldMatch.List({
@FieldMatch(firstValue = "password" , secondValue = "confirmPassword")
})
public class RequestAccountBackingObject implements Serializable {
private String password;
private String confirmPassword;
和实现:
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = FieldMatchImpl.class)
@Documented
public @interface FieldMatch{
String message() default "{com.errorMessage}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String firstValue();
String secondValue();
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Documented
@interface List
{ FieldMatch[] value(); }
}
其他FieldMatchImpl将是:
public class FieldMatchImpl implements ConstraintValidator<FieldMatch, Object>{
private String firstFieldName;
private String secondFieldName;
并且您需要执行两种方法:
public void initialize(final FieldMatch constraintAnnotation){
firstFieldName = constraintAnnotation.firstValue();
secondFieldName = constraintAnnotation.secondValue();
另外:
public boolean isValid(final Object value, final ConstraintValidatorContext context){
final String firstObj = BeanUtils.getProperty(value, firstFieldName);
final String secondObj = BeanUtils.getProperty(value, secondFieldName);
使用org.apache.commons.beanutils.BeanUtils你现在可以验证这两个领域。
像这样:
boolean result = firstObj.equals(secondObj);
if(!result) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(errorMessage).addNode(firstFieldName).addConstraintViolation();
}
其他然后,它一直使用Hibernate的验证到目前为止一种乐趣。
感谢您给予一个很好的理解回复尤金,那另一个验证呢? – Anshul 2011-12-22 09:44:06
我希望我能为你详细解答一个答案,但是我使用Spring验证已经很长时间了。:(因为JSR 303成为规范和Hibernate Validator的参考实现,我真的认为Spring将自己转向相同的方向。 – Eugene 2011-12-23 15:04:07