SpringBoot系统列 4 - 常用注解、拦截器、异常处理
在前面代码基础上进行改造;
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()); } }
看效果:
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(); } }