自定义注解与validation结合使用案例
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"时通过校验,而当是其他值的时候,就会抛出校验异常。
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}) @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; } } } }
public interface ConstraintValidator<A extends Annotation, T> { // 在验证之前调用该方法 void initialize(A constraintAnnotation); // 验证方法 返回false说明没有通过校验 value的类型T可以有多种类型时,如案例2写多个校验类 boolean isValid(T value, ConstraintValidatorContext context); }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。