java注解编程:https://blog.csdn.net/u014292162/article/details/53001224
1、ValueValidNotNull
package com.cn.dl.controller;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* 自定义校验注解
* Created by Tiger on 2019/1/9.
*/
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//指定注解的实现类
@Constraint(validatedBy = ValueValidNotNullImpl.class)
public @interface ValueValidNotNull {
// TODO: 2019/1/10 可以添加其它扩展的属性
String message() default "Value cannot be null";
// TODO: 2019/1/10 groups 和 payload 这两个parameter 必须包含
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
2、ValueValidNotNullImpl
package com.cn.dl.controller;
import org.springframework.stereotype.Service;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* 自定义校验注解
* Created by Tiger on 2019/1/9.
*/
@Service
public class ValueValidNotNullImpl implements ConstraintValidator<ValueValidNotNull, String> {
@Override
public void initialize(ValueValidNotNull constraintAnnotation) {
// TODO: 2019/1/10 初始化操作
}
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
// TODO: 2019/1/10 具体逻辑
if(value == null || value.isEmpty()){
return false;
}
return true;
}
}
3、User
package com.cn.dl.bean;
import com.cn.dl.controller.ValueValidNotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* Created by Tiger on 2019/1/9.
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User {
// @NotNull(message = "name不能为空")
@ValueValidNotNull(message = "name 不能为空")
private String name;
private String address;
}
4、controller部分代码
@PostMapping("/user")
public JSONObject User(@Valid User user,BindingResult bindingResult){
JSONObject json = new JSONObject();
if(bindingResult.hasErrors()){
json.put("errorCode","9999");//表示失败
json.put("errorMsg",bindingResult.getFieldError().getDefaultMessage());
return json;
}
json.put("errorCode","0000");//表示成功
return json;
}
5、测试
输入name=tiger
不输入name
6、遇到的异常
自定义的校验注解:groups 和 payload 这两个parameter 必须包含
javax.validation.ConstraintDefinitionException: HV000074: com.cn.dl.controller.ValueValidNotNull contains Constraint annotation, but does not contain a groups parameter.
at org.hibernate.validator.internal.metadata.core.ConstraintHelper.assertGroupsParameterExists(ConstraintHelper.java:900)
at org.hibernate.validator.internal.metadata.core.ConstraintHelper.lambda$isConstraintAnnotation$5(ConstraintHelper.java:862)
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
at org.hibernate.validator.internal.metadata.core.ConstraintHelper.isConstraintAnnotation(ConstraintHelper.java:860)
at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findConstraintAnnotations(AnnotationMetaDataProvider.java:507)
at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findConstraints(AnnotationMetaDataProvider.java:461)
at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findPropertyMetaData(AnnotationMetaDataProvider.java:232)
at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getFieldMetaData(AnnotationMetaDataProvider.java:225)
at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.retrieveBeanConfiguration(AnnotationMetaDataProvider.java:133)
at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getBeanConfiguration(AnnotationMetaDataProvider.java:124)
at org.hibernate.validator.internal.metadata.BeanMetaDataManager.getBeanConfigurationForHierarchy(BeanMetaDataManager.java:220)
at org.hibernate.validator.internal.metadata.BeanMetaDataManager.createBeanMetaData(BeanMetaDataManager.java:187)
at org.hibernate.validator.internal.metadata.BeanMetaDataManager.lambda$getBeanMetaData$0(BeanMetaDataManager.java:160)
at java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:324)
at org.hibernate.validator.internal.metadata.BeanMetaDataManager.getBeanMetaData(BeanMetaDataManager.java:159)
at org.hibernate.validator.internal.engine.ValidationContext$ValidationContextBuilder.forValidate(ValidationContext.java:566)
at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:155)
at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:108)
at org.springframework.boot.autoconfigure.validation.ValidatorAdapter.validate(ValidatorAdapter.java:64)
at org.springframework.validation.DataBinder.validate(DataBinder.java:883)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.validateIfApplicable(ModelAttributeMethodProcessor.java:360)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:162)
javax.validation.ConstraintDefinitionException: HV000074: com.cn.dl.controller.ValueValidNotNull contains Constraint annotation, but does not contain a payload parameter.
at org.hibernate.validator.internal.metadata.core.ConstraintHelper.assertPayloadParameterExists(ConstraintHelper.java:884)
at org.hibernate.validator.internal.metadata.core.ConstraintHelper.lambda$isConstraintAnnotation$5(ConstraintHelper.java:863)
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
at org.hibernate.validator.internal.metadata.core.ConstraintHelper.isConstraintAnnotation(ConstraintHelper.java:860)
at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findConstraintAnnotations(AnnotationMetaDataProvider.java:507)
at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findConstraints(AnnotationMetaDataProvider.java:461)
at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findPropertyMetaData(AnnotationMetaDataProvider.java:232)
at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getFieldMetaData(AnnotationMetaDataProvider.java:225)
at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.retrieveBeanConfiguration(AnnotationMetaDataProvider.java:133)
at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getBeanConfiguration(AnnotationMetaDataProvider.java:124)
at org.hibernate.validator.internal.metadata.BeanMetaDataManager.getBeanConfigurationForHierarchy(BeanMetaDataManager.java:220)
at org.hibernate.validator.internal.metadata.BeanMetaDataManager.createBeanMetaData(BeanMetaDataManager.java:187)
at org.hibernate.validator.internal.metadata.BeanMetaDataManager.lambda$getBeanMetaData$0(BeanMetaDataManager.java:160)
at java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:324)
at org.hibernate.validator.internal.metadata.BeanMetaDataManager.getBeanMetaData(BeanMetaDataManager.java:159)
at org.hibernate.validator.internal.engine.ValidationContext$ValidationContextBuilder.forValidate(ValidationContext.java:566)
at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:155)
at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:108)
at org.springframework.boot.autoconfigure.validation.ValidatorAdapter.validate(ValidatorAdapter.java:64)
at org.springframework.validation.DataBinder.validate(DataBinder.java:883)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.validateIfApplicable(ModelAttributeMethodProcessor.java:360)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:162)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:126)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:166)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)