开发 web 的过程中校验并返回错误信息,的简单操作一直是我们一直以来追求的。如何用最方便最实用的方法来校验,这里 spring 给我们提供了极为方便的操作。
返回提示信息
校验完第一个操作应该返回错误或提示信息,所以这里先说如何简单而又方便的返回错误信息。
-
spring 提供了异常统一处理的操作。@ControllerAdvice
-
从这里可以看到 _@ControllerAdvice_也注释了 @Component,只要扫描它,它也会被 spring 自动注入。
-
@ControllerAdvice 中其他注解暂时不论,主要说明一下 @ExceptionHandler 这个注释在方法上的注解,下面是这个注解的一个例子
-
@ExceptionHandler 注解在方法上,提供一个默认异常来智能拦截。比如声明一个 TipException 异常类(继承 RuntimeException);如果在运行时抛出 TipException 异常,会被该方法拦截到,并进行下一步的处理(返回提示信息,或错误页面)
校验问题
既然有了 @ControllerAdvice,那我们可以随时随地的抛出错误信息。接下来就是校验问题:直接在业务逻辑中写校验代码,会增加代码的难读性和逻辑的复杂性,简单的方法就是在外部写出校验,需要就调用就好。spring 自带有拦截器,可是一个个方法的拦截器都需要配置;aop 却是"大题小用";而且,如果需要校验的请求过多,确实有点不简明。借鉴 jfinal,启发了我们是不是能在拦截器上花点功夫?
- 预想是这样,我们只需要在所要校验的方法上,加个注释(比如叫做:@Before),给它加不同的校验类,来实现不同的校验效果。
- 首先写一个声明,@Before,并声明它是在方法上用。
- 里面 value 值是一个校验类数组。
- 接下来,声明一个接口 BeforeInterceptor,该接口中只有一个方法,以进行校验操作。所有的校验类,必须继承该接口。
void doOperator(HttpServletRequest request, HttpServletResponse response);
- 紧接着,创建一个普通的 spring 内部拦截器,拦截所有请求。
在 preHandle 方法中,进行校验。
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
HandlerMethod handlerMethod = (HandlerMethod) o;
Method method = handlerMethod.getMethod();
Before before = method.getAnnotation(Before.class);
if(before != null){
Class<? extends BeforeInterceptor>[] beforeList = before.value();
for(Class<? extends BeforeInterceptor> oneClazz : beforeList){
BeforeInterceptor oneEntity= applicationContext.getBean(oneClazz);
oneEntity.doOperator(httpServletRequest,httpServletResponse); //调用方法
}
}
return true;
}
- 而校验类只需要进行应有的操作,必要时抛出错误信息即可。
- 所请求的方法,只需要加 @Before 声明,并根据需求添加校验类。
- PS:根据需求可以扩展在类上加 Before 注解,校验其下所有请求。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于