案例1:
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
-
- import javax.validation.Constraint;
- import javax.validation.ConstraintValidator;
- import javax.validation.ConstraintValidatorContext;
- import javax.validation.Payload;
-
- import org.springframework.data.mongodb.core.mapping.Document;
-
- @Target({ ElementType.FIELD, ElementType.METHOD })
- @Retention(RetentionPolicy.RUNTIME)
- @Document
- @Constraint(validatedBy = { Name.NameChecker.class })
- public @interface Name {
- String message() default "名称不存在";
-
- Class<?>[]groups() default {};
-
- Class<? extends Payload>[]payload() default {};
-
- public static class NameChecker implements ConstraintValidator<Name, String> {
-
- @Override
- public void initialize(Name constraintAnnotation) {
-
- }
-
- @Override
- public boolean isValid(String value, ConstraintValidatorContext context) {
- if ("111111".equals(value)) {
- return true;
- }
- return false;
- }
-
- }
- }
- public class UserVo {
-
- @NotBlank(message = "[用户名不能为空]")
- @Length(max = 64, min = 6, message = "[用户名]长度6~64")
- @Name
- private String username;
-
- @NotBlank(message = "[密码不能为空]")
- @Length(max = 64, min = 6, message = "[密码]长度6~64")
- private String password;
-
- @NotNull(message = "[出生日期不能为空]")
- private Date birthDate;
- }
- @RestController
- @RequestMapping("/v0.1/users")
- public class UserController {
-
- @Autowired
- private UserRecordService service;
-
- @RequestMapping(method = RequestMethod.POST)
- public UserRecord add(@RequestBody @Valid UserVo vo) {
- UserRecord user = new UserRecord();
- BeanUtils.copyProperties(vo, user);
- return service.add(user);
- }
-
- @RequestMapping(method = RequestMethod.GET)
- public Items<UserRecord> list(ListParam<UserRecord> listParam){
- return service.list(listParam);
- }
- }
当username取值为"111111"时通过校验,而当是其他值的时候,就会抛出校验异常。
案例2
- package com.nd.social.common.validation;
-
- import com.nd.gaea.WafException;
- import com.nd.gaea.client.WafResourceAccessException;
- import com.nd.social.common.util.UCHelper;
- import org.apache.commons.lang3.StringUtils;
- import org.springframework.web.client.ResourceAccessException;
-
- import javax.validation.Constraint;
- import javax.validation.ConstraintValidator;
- import javax.validation.ConstraintValidatorContext;
- import javax.validation.Payload;
- import java.lang.annotation.*;
-
-
-
-
-
-
- @Target({ElementType.FIELD, ElementType.METHOD})
- @Retention(RetentionPolicy.RUNTIME)
- @Constraint(validatedBy = {SameTenant.StringChecker.class, SameTenant.LongChecker.class})
- @Documented
- public @interface SameTenant {
-
- String message() default "用户不存在或者不属于当前组织";
-
- Class<?>[] groups() default {};
-
- Class<? extends Payload>[] payload() default {};
-
- class StringChecker implements ConstraintValidator<SameTenant, String> {
-
- @Override
- public void initialize(SameTenant arg0) {
- }
-
- @Override
- public boolean isValid(String uid, ConstraintValidatorContext context) {
- if (StringUtils.isBlank(uid)) {
- return true;
- }
- try {
- return UCHelper.isSameTenant(uid);
- } catch (WafResourceAccessException | WafException | ResourceAccessException e) {
- return false;
- }
- }
- }
-
- class LongChecker implements ConstraintValidator<SameTenant, Long> {
-
- @Override
- public void initialize(SameTenant arg0) {
- }
-
- @Override
- public boolean isValid(Long uid, ConstraintValidatorContext context) {
- if (null == uid) {
- return true;
- }
- try {
- return UCHelper.isSameTenant(uid.toString());
- } catch (WafResourceAccessException | WafException | ResourceAccessException e) {
- return false;
- }
- }
- }
- }
调用
package com.pactera.testing.platform;import java.lang.reflect.Field;import com.pactera.model.platform.authority.SysUser;
import com.pactera.model.validations.valUserName;public class TestVal {public static void main(String[] args) throws Exception{SysUser user=new SysUser();user.setUserCode("123");valid(user);System.exit(0);}
public static valUserName dv=null;//解析的入口public static void valid(Object object) throws Exception{//获取object的类型Class<? extends Object> clazz=object.getClass();//获取该类型声明的成员Field[] fields=clazz.getDeclaredFields();//遍历属性for(Field field:fields){//对于private私有化的成员变量,通过setAccessible来修改器访问权限field.setAccessible(true);System.out.println(field.getName());validate(field,object);//重新设置会私有权限field.setAccessible(false);}}public static void validate(Field field,Object object) throws Exception{String description;Object value;value=field.get(object);System.out.println(value);dv=field.getAnnotation(valUserName.class);System.out.println( dv.message());}
}
3 ConstraintValidator
- public interface ConstraintValidator<A extends Annotation, T> {
-
- void initialize(A constraintAnnotation);
-
- boolean isValid(T value, ConstraintValidatorContext context);
- }
4 利用注解回写值
方法1:把输入进去的123修改成了777返回
import java.lang.reflect.Method;import com.pactera.model.platform.authority.SysUser;
import com.pactera.model.validations.valUserName;public class TestVal {public static void main(String[] args) throws Exception{SysUser user=new SysUser();user.setUserCode("123");valid(user);System.out.print("12345678765434567------"+user.getUserCode());//System.exit(0);}
public static valUserName dv=null;//解析的入口public static void valid(Object object) throws Exception{//获取object的类型Class<? extends Object> clazz=object.getClass();//获取该类型声明的成员Field[] fields=clazz.getDeclaredFields();//遍历属性for(Field field:fields){//对于private私有化的成员变量,通过setAccessible来修改器访问权限field.setAccessible(true);System.out.println(field.getName());validate(field,object,clazz);//重新设置会私有权限field.setAccessible(false);}}public static void validate(Field field,Object object,Class<? extends Object> clazz) throws Exception{try{String description;Object value;Class clazzzobj = object.getClass();//获取对象的类型 value=field.get(object);System.out.println(value);dv=field.getAnnotation(valUserName.class);System.out.println( dv.message());String fieldName=field.getName();PropertyDescriptor pd = new PropertyDescriptor(fieldName, clazz); Method setMethod = pd.getWriteMethod(); field.set(object, "7777");// String temp ="777";value.toString();// Long.parseLong(fieldValue); // setMethod.invoke(clazzzobj, String.valueOf(temp));}catch(NullPointerException exp){}}
}
方法2
PropertyDescriptor pd = new PropertyDescriptor(fieldName, clazz);Method setMethod = pd.getWriteMethod();Long temp = Long.parseLong(fieldValue);setMethod.invoke(bean, String.valueOf(temp));