自定义注解与validation结合使用案例

来源:互联网 发布:诺维斯基体测数据 编辑:程序博客网 时间:2024/05/18 02:31

案例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> {@Overridepublic void initialize(Name constraintAnnotation) {}@Overridepublic 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.*;/** * uid是否属于当前上下文租户 * 注:当被校验对象为空时,校验为通过,所以如果需要校验对象必填,请自行结合相关校验注解 * Created by Zhang JinLong(150429) on 2016-09-18. */@Target({ElementType.FIELD, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = {SameTenant.StringChecker.class, SameTenant.LongChecker.class})@Documentedpublic @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;            }        }    }}



3 ConstraintValidator

public interface ConstraintValidator<A extends Annotation, T> {        // 在验证之前调用该方法        void initialize(A constraintAnnotation);                   // 验证方法  返回false说明没有通过校验  value的类型T可以有多种类型时,如案例2写多个校验类        boolean isValid(T value, ConstraintValidatorContext context);}








0 0
原创粉丝点击