springboot⾃定义注解判断参数是否传递或者为空
原⽂链接:
1.⾃定义个注解类
@Target({ElementType.PARAMETER})//参数级别
@Retention(RetentionPolicy.RUNTIME) //注解保留到运⾏阶段
public @interface ParamsNotNull {
}
@Target
通俗讲,定义放在什么位置,这个是放在参数中
此外还有
1.ElementType.CONSTRUCTOR:⽤于描述构造器
2.ElementType.FIELD:⽤于描述域(类的成员变量)
3.ElementType.LOCAL_VARIABLE:⽤于描述局部变量(⽅法内部变量)
4.ElementType.METHOD:⽤于描述⽅法
5.ElementType.PACKAGE:⽤于描述包
6.ElementType.PARAMETER:⽤于描述参数
7.ElementType.TYPE:⽤于描述类、接⼝(包括注解类型) 或enum声明
@Retention 定义了该Annotation被保留的时间长短,有些只在源码中保留,有时需要编译成的class中保留,有些需要程序运⾏时候保留。即描述注解的⽣命周期
此时针对的在运⾏中,此外还有
1.RetentionPoicy.SOURCE:在源⽂件中有效(即源⽂件保留)
2.RetentionPoicy.CLASS:在class⽂件中有效(即class保留)
2.⾃定义,具体判断请求来的参数
/**
* @Description 参数检查注解
*/
public class CheckParamsInterceptor extends HandlerInterceptorAdapter {
private static Logger logger = Logger(CheckParamsInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!(handler instanceof HandlerMethod)) {
logger.warn("UnSupport handler");
return true;
}
List<String> list = getParamsName((HandlerMethod) handler);
for (String s : list) {
String parameter = Parameter(s);
if (StringUtils.isEmpty(parameter)){
JSONObject jsonObject = new JSONObject();
//这个地⽅是定义缺少参数或者参数为空的时候返回的数据
jsonObject.put("status", 203);
jsonObject.put("msg", "缺少必要的"+s+"值");
response.setHeader("Content-type", "application/json;charset=UTF-8");
response.setHeader("Access-Control-Allow-Origin", "*");//跨域
return false;
}
}
return true;
}
/**
* 获取使⽤了该注解的参数名称
*/
private List getParamsName(HandlerMethod handlerMethod) {
Parameter[] parameters = Method().getParameters();
List<String> list = new ArrayList<>();
for (Parameter parameter : parameters) {
//判断这个参数时候被加⼊了 ParamsNotNull. 的注解
//.isAnnotationPresent() 这个⽅法可以看⼀下
if(parameter.isAnnotationPresent(ParamsNotNull.class)){
list.Name());
}
}
return list;
}
3.添加校验的config
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
CheckParamsInterceptor checkSourceInterceptor = new CheckParamsInterceptor();
//增加校验
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 这个地⽅可以定义的具体的路径
registry.addInterceptor(checkSourceInterceptor).addPathPatterns("/**");
springboot是啥}
}
4.写⼀个测试类测试⼀下效果
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/test")
//注解不要加,在参数类型前边加上
public String test(@ParamsNotNull String userId){
return"ok";
}
}
这个是当参数为空的时候的校验
这个是没有这个参数属性的时候,其实效果是⼀样的
这样以后再判断参数是不是为空的时候,直接加个注解就可以了~!就不⽤再单独判断参数为空啦!原⽂链接:blog.csdn/weixin_37535975/article/details/94443617
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论