寫接口,Dto里很多字段要檢驗傳參范圍,自定義個注解來校驗。
1、定義注解
注解定義代碼:
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.*;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
@Target(ElementType.FIELD)
@Constraint(validatedBy = ListValue.ValidIfInRange.class) //借助@Constraint注解實現(xiàn)自定義校驗邏輯,validatedBy屬性是數(shù)組類型,可同時定義多種校驗邏輯
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ListValue {
String message() default "The parameters are out of range, please check it."; //超出取值范圍后的拋錯信息
String[] valueList() default {}; //要檢驗的取值范圍
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
class ValidIfInRange implements ConstraintValidator<ListValue, String> {
private final Set<String> set = new HashSet<>();
/**
* 初始化邏輯,把取值范圍存入Collection集合
*/
@Override
public void initialize(ListValue constraintAnnotation) {
String[] values = constraintAnnotation.valueList();
set.addAll(Arrays.asList(values));
}
/**
* 校驗邏輯,返回false即值不存在,代表超出范圍
*/
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
return set.contains(s);
}
}
}
實現(xiàn)思路是使用JSR303校驗框架的@Constraint注解,實現(xiàn)ConstraintValidator接口,定義初始化和參數(shù)校驗邏輯。
<!--PS: JSR303校驗框架依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2、使用注解
@PostMapping("/test")
public void doSome3(@Validated @RequestBody Dto dto){
}
public class Dto {
@ListValue(valueList = {"createTime", "updateTime"}, message ="排序字段超出取值范圍")
String orderField;
}
調(diào)用下:
3、其余校驗實現(xiàn)思路2.0
借用 @JsonCreator 注解,反序列化前端傳參成一個枚舉對象時,進(jìn)行校驗。
@AllArgsConstructor
@Getter
public enum OrderFieldEnum {
CREATE_TIME("createTime","create_time"),
USER_NAME("userName","user_name");
private final String value;
private final String field;
private static final Map<String,OrderFieldEnum> map = new HashMap<>(3);
@JsonCreator
public static OrderFieldEnum unSerializer(String value){
//把以value為key,以枚舉對象為value,存進(jìn)map
if(map.isEmpty()){
for (OrderFieldEnum fieldEnum : OrderFieldEnum.values()) {
map.put(fieldEnum.value,fieldEnum);
}
}
//map中找不到就是超出范圍
if(!map.containsKey(value)){
throw new RuntimeException("超出范圍");
}
return map.get(value);
}
@JsonValue
public String getValue(){
return this.value;
}
}
此時Dto:
public class Dto {
OrderFieldEnum orderField;
}
4、其余校驗實現(xiàn)思路3.0
這個就比較原始了,直接枚舉類定義靜態(tài)代碼塊完成取值范圍初始化 + 一個靜態(tài)方法完成校驗:
這么實現(xiàn)的話,Service層就得調(diào)用方法校驗下:文章來源:http://www.zghlxwxcb.cn/news/detail-812770.html
@Service
public Service implements IService{
@Override
public doSome(Dto dto){
FieldEnum.checkCodeExist(dto.getField);
//....
}
}
其余優(yōu)秀帖子備份:https://juejin.cn/post/7009190724214194207文章來源地址http://www.zghlxwxcb.cn/news/detail-812770.html
到了這里,關(guān)于注解實現(xiàn)校驗接口傳參是否超出取值范圍的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!