OVAL 场景验证
2014-03-29 17:18
106 查看
初学OVAL遇到这种情况:
一个User的model,当你登录的时候,你只需要验证用户名和密码字段。当你注册用户的时候你需要验证用户名,密码,邮箱等等。
出现这种情况的时候,不知道该怎么办,也问过一些用过OVAL框架的人,他们说写两个DTO分别来验证。
经过几天的思索,我想到了场景验证,这也是我坐PHP时候用Yii框架时,Yii框架提供的验证规则。
我觉得挺适合这个场景的。也就是说把登录作为一个场景,把注册作为另一个场景,OVAL验证的时候根据场景的不同来验证不同的字段,这样就不需要创建多个DTO。
这里就简单说说我的实现方案(也许OVAL提供了这种问题的解决方案),直接上代码了:
场景验证的注解:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidateScene {
String[] scene();
}
在Model上使用:
@Column(name="username", length=200, unique=false)
private String username;
@Column(name="password", length=200, nullable=false, unique=false)
@NotNull
@Length(max=200)
@ValidateScene(scene={SceneConstants.LOGIN})
private String password;
@Column(name="email", length=200, nullable=false, unique=true)
@NotNull
@Length(max=200)
@Email
@ValidateScene(scene={SceneConstants.LOGIN})
private String email;
自定义一个Validator:
在Action中使用Validator:
public String userLogin()
throws DataWarningException, ServerErrorException {
validator.validate(User.class, user, SceneConstants.LOGIN);
userService.userLogin(user, session);
return SUCCESS;
}
思路:
自定义一个Validator继承oval的validator,在这个validator中获取要验证的model的场景注解,然后一个一个的验证。
一个User的model,当你登录的时候,你只需要验证用户名和密码字段。当你注册用户的时候你需要验证用户名,密码,邮箱等等。
出现这种情况的时候,不知道该怎么办,也问过一些用过OVAL框架的人,他们说写两个DTO分别来验证。
经过几天的思索,我想到了场景验证,这也是我坐PHP时候用Yii框架时,Yii框架提供的验证规则。
我觉得挺适合这个场景的。也就是说把登录作为一个场景,把注册作为另一个场景,OVAL验证的时候根据场景的不同来验证不同的字段,这样就不需要创建多个DTO。
这里就简单说说我的实现方案(也许OVAL提供了这种问题的解决方案),直接上代码了:
场景验证的注解:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidateScene {
String[] scene();
}
在Model上使用:
@Column(name="username", length=200, unique=false)
private String username;
@Column(name="password", length=200, nullable=false, unique=false)
@NotNull
@Length(max=200)
@ValidateScene(scene={SceneConstants.LOGIN})
private String password;
@Column(name="email", length=200, nullable=false, unique=true)
@NotNull
@Length(max=200)
@ValidateScene(scene={SceneConstants.LOGIN})
private String email;
自定义一个Validator:
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import net.sf.oval.ConstraintViolation; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import com.aug.annotation.ValidateScene; import com.aug.constant.ErrorCodeConstant; import com.aug.exception.DataWarningException; import com.aug.exception.ServerErrorException; @Component(value="validator") public class Validator extends net.sf.oval.Validator { private static Logger logger = Logger.getLogger(Validator.class); public void validate(Class<?> clazz, Object object, String scene) throws DataWarningException, ServerErrorException { if (object == null) { logger.warn(clazz.getName() + "cannot be null."); throw new DataWarningException(ErrorCodeConstant.VALIDATE_ERROR); } List<Field> needValidateField = new ArrayList<Field>(); Field[] fields = object.getClass().getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(ValidateScene.class)) { ValidateScene validateScene = field.getAnnotation(ValidateScene.class); String[] scenes = validateScene.scene(); for (String sceneStr : scenes) { if (sceneStr.equals(scene)) { needValidateField.add(field); break; } } } } StringBuilder sb = new StringBuilder(); boolean isValidatePass = true; for (Field field : needValidateField) { field.setAccessible(true); List<ConstraintViolation> violation = null; try { violation = validateFieldValue( object, field, field.get(object)); } catch (Exception e) { logger.error(e.getStackTrace(), e); throw new ServerErrorException(ErrorCodeConstant.SERVER_ERROR); } if (violation.size() > 0) { isValidatePass = false; for (ConstraintViolation constraintViolation : violation) { sb.append(constraintViolation.getMessage()); sb.append(","); } } } if (isValidatePass == false) { logger.warn("validate error, message is " + sb.toString()); System.out.println(sb.toString()); throw new DataWarningException(ErrorCodeConstant.VALIDATE_ERROR); } } }
在Action中使用Validator:
public String userLogin()
throws DataWarningException, ServerErrorException {
validator.validate(User.class, user, SceneConstants.LOGIN);
userService.userLogin(user, session);
return SUCCESS;
}
思路:
自定义一个Validator继承oval的validator,在这个validator中获取要验证的model的场景注解,然后一个一个的验证。
相关文章推荐
- 浅析JSR303 验证作用、使用及使用场景、spring mvc下使用JSR303
- tp5数据验证及验证场景详解
- 浅析JSR303 验证作用、使用及使用场景、spring mvc下使用JSR303
- 浅析JSR303 验证作用、使用及使用场景、spring mvc下使用JSR303
- JavaScript解决一个带验证的Form两个Submit事件(一个页面保持不动【AJAX实现】,一个页面提交并跳转)的场景
- 浅析JSR303 验证作用、使用及使用场景、spring mvc下使用JSR303
- OVAL验证框架帮助文档_OVAL API
- CephRGW 在多个RGW负载均衡场景下,RGW 大文件并发分片上传功能验证
- 浅析JSR303 验证作用、使用及使用场景、spring mvc下使用JSR303
- Yii框架中的rules中的验证规则场景,'on'=>'search'表示什么?
- Yii2中的场景(scenario)和验证规则(rule)详解
- 浅析JSR303 验证作用、使用及使用场景、spring mvc下使用JSR303
- 浅析JSR303 验证作用、使用及使用场景、spring mvc下使用JSR303
- java开源验证框架OVAL应用实例
- 验证码短信应用场景
- 浅析JSR303 验证作用、使用及使用场景、spring mvc下使用JSR303
- yii验证规则的on适用场景设置 $model->setScenario('a');
- [thinkPHP5项目实战_14]场景验证
- 浅析JSR303 验证作用、使用及使用场景、spring mvc下使用JSR303
- Spring MVC表单上传场景下的验证