SpringBoot系统列 4 - 常用注解、拦截器、异常处理

时间:2022-06-28 11:01:09

在前面代码基础上进行改造;

1.SpringBoot常用注解

@SpringBootApplication :指定SpringBoot项目启动的入口,是一个复合注解,由@Configuration、@EnableAutoConfiguration、@ComponentScan三个注解。

@Configuration:表示将该类作用springboot配置文件类。

@EnableAutoConfiguration:表示程序启动时,自动加载springboot默认的配置。

@ComponentScan:表示程序启动是,自动扫描当前包及子包下所有类。

@SpringBootConfiguration:说明这是一个配置文件类,就像xml配置文件,而现在是用java配置文件。

@Value:通过这个注解可以来读取.properties或.yml中配置的属性。

@Bean:这个注解是方法级别上的注解,主要添加在 @Configuration 或 

@SpringBootConfiguration 注解的类,有时也可以添加在 。

@Component 注解的类。它的作用是定义一个Bean。

2.拦截器

先定义拦截器:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* 拦截器
* @author XIHONGLEI
* @date 2018-11-02
*/
public class ApiInterceptor implements HandlerInterceptor { /**
* 请求之前访问
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("请求之前拦截...");
return true;
} /**
* 请求时访问
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("请求中拦截...");
} /**
* 请求完成后访问
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("请求完成后拦截...");
}
}

再将自定义拦截器添加注册进系统

import com.hello.filter.ApiInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; /**
* 配置类
* @author XIHONGLEI
* @date 2018-10-31
*/
@SpringBootConfiguration
public class WebConfig extends WebMvcConfigurationSupport { @Override
protected void addInterceptors(InterceptorRegistry registry) {
super.addInterceptors(registry);
// 将 ApiInterceptor 拦截器类添加进去
registry.addInterceptor(new ApiInterceptor());
}

看效果:

SpringBoot系统列 4 - 常用注解、拦截器、异常处理

3.异常处理

创建异常处理类->加入@Aspect、@Component 注解->对请求链接进行拦截->发生异常之后的异常处理

import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; /**
* 异常拦截处理
*
* @author XIHONGLEI
* @date 2018-11-02
*/
@Aspect
@Component
public class WebExceptionAspect {
//凡是注解了RequestMapping的方法都被拦截
@Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
private void webPointcut() {
System.out.println("请求被拦截...");
} /**
* 拦截web层异常,记录异常日志,并返回友好信息到前端
* 目前只拦截Exception,是否要拦截Error需再做考虑
* @param e 异常对象
*/
@AfterThrowing(pointcut = "webPointcut()", throwing = "e")
public void handleThrowing(Exception e) {
System.out.println("出现异常:");
e.printStackTrace();
// 输出错误提示到浏览器
writeContent("您请求的链接出现异常,请重试!");
} /**
* 将内容输出到浏览器
* @param content 输出内容
*/
private void writeContent(String content) {
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
response.reset();
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "text/plain;charset=UTF-8");
response.setHeader("icop-content-type", "exception");
PrintWriter writer = null;
try {
writer = response.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
writer.print(content);
writer.flush();
writer.close();
}
}