文档章节

SpringBoot学习之统一异常处理、404处理以及集成Swagger2

j
 jredream
发布于 2017/03/23 16:51
字数 651
阅读 343
收藏 1

一:集成Swagger2:

首先在pom中添加依赖,然后通过编写配置类,最后可以通过@Conditional注解来选择生成API的时机,配置完成后通过

1-1:pom.xml

<!-- Swagger2.x -->
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.2.2</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.2.2</version>
		</dependency>

1-2: SwaggerCondition.java

package com.redreamer.config.swagger;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
@Conditional(SwaggerCondition.class)
public class SwaggerConfig {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.redreamer.web"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring Boot中使用Swagger2生成在线API")
                .description("https://www.hh-medic.com/")
                .termsOfServiceUrl("https://www.hh-medic.com/")
                .contact("和缓医疗")
                .version("v1.0")
                .build();
    }
}

1-3: 自定义Condition:SwaggerCondition.java

package com.redreamer.config.swagger;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

import java.util.Arrays;


public class SwaggerCondition implements Condition {

    /**
     * 只在开发环境时swagger生效
     *
     * @param conditionContext
     * @param annotatedTypeMetadata
     * @return
     */
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        String[] activeProfiles = conditionContext.getEnvironment().getActiveProfiles();
        return activeProfiles != null && Arrays.asList(activeProfiles).contains("dev");
    }

}

 

二:统一异常处理以及404处理

首先使用@ControllerAdvice来拦截状态不是404的异常,因为404比较特殊需要特殊配置一下
2-1:使用@ControllerAdvice来拦截状态不是404的异常
GlobalExceptionHandler.java

package com.redreamer.common.exception;

import com.redreamer.common.ResponseResult;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

/**
 * 统一异常处理(404在ErrorController中处理)
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseResult<String> handleError(HttpServletRequest request, Exception e) {
        int status = 400;
        if (e instanceof ServiceException) {
            status = ((ServiceException) e).getCode();
        }
        String requestURI = request.getRequestURI();
        return new ResponseResult<>(status, e.getMessage(), requestURI);
    }

}

2-2: 404异常处理

2-2-1:在Application.java添加如下配置(这里使用了Java 8 Lambda 表达式)

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
    return container -> {
        container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404"));
    };
}

2-2-2: 配置具体处理的类

NotFountExceptionHandler.java

package com.redreamer.common.exception;

import com.redreamer.common.ResponseResult;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

@Controller
public class NotFountExceptionHandler {

    /**
     * 需要在Application中配置如下:
     *
     * @param request
     * @return
     * @Bean public EmbeddedServletContainerCustomizer containerCustomizer() {
     * return container -> {
     * container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404"));
     * };
     * }
     */
    @RequestMapping(value = "/404")
    @ResponseBody
    public ResponseResult<String> _404(HttpServletRequest request) {
        String realRequestPath = request.getAttribute("javax.servlet.forward.servlet_path").toString();
        return new ResponseResult<>(404, "not fount", realRequestPath);
    }

}

其他用的的类:

ResponseResult.java

package com.redreamer.common;

import lombok.Data;

import java.io.Serializable;

/**
 * 统一返回结果处理
 */
@Data
public class ResponseResult<T> implements Serializable {

    private int status;     // 状态
    private String message; // 返回消息
    private T data;         // 具体数据

    public ResponseResult() {
        this(200, "success");
    }

    public ResponseResult(T data) {
        this();
        this.data = data;
    }

    public ResponseResult(int status, String message) {
        this.status = status;
        this.message = message;
    }

    public ResponseResult(int status, String message, T data) {
        this.status = status;
        this.message = message;
        this.data = data;
    }


    // --------- 工厂方法创建返回结果 ---------
    public static <T> ResponseResult success(T data) {
        return new ResponseResult<>(data);
    }

    public static <T> ResponseResult success() {
        return new ResponseResult<>();
    }

}

ServiceException.java

package com.redreamer.common.exception;

/**
 * 自定义异常
 */
public class ServiceException extends RuntimeException {

    private int status;

    public ServiceException() {
        super();
    }

    public ServiceException(String message) {
        super(message);
    }

    public ServiceException(Throwable cause) {
        super(cause);
    }

    public ServiceException(String message, Throwable cause) {
        super(message, cause);
    }

    public ServiceException(int status, String message) {
        super(message);
        this.status = status;
    }

    public ServiceException(int status, String message, Throwable cause) {
        super(message, cause);
        this.status = status;
    }

    public int getCode() {
        return status;
    }

    public void setCode(int status) {
        this.status = status;
    }

}

© 著作权归作者所有

j
粉丝 1
博文 12
码字总数 2581
作品 0
海淀
私信 提问
springboot + shiro 权限注解、请求乱码解决、统一异常处理

springboot + shiro 权限注解、请求乱码解决、统一异常处理 前篇 后台权限管理系统 相关: spring boot + mybatis + layui + shiro后台权限管理系统 springboot + shiro之登录人数限制、登录...

wyait
2018/06/06
0
0
Spring Boot学习笔记

多模块开发 [SpringBoot学习]-IDEA创建Gradle多Module结构的SpringBoot项目 RabbitMQ RabbitMQ 安装 linux安装RabbitMQ详细教程 Ubuntu 16.04 RabbitMq 安装与运行(安装篇) ubantu安装...

OSC_fly
2018/07/26
0
0
SpringMVC集成Swagger2访问404问题

@superduper 你好,想跟你请教个问题: 最近看了你的Swagger2 SpringMVC集成(非SpringBoot)这篇文章,我也自己配置了一个在自己的项目中,Swagger2-ui页面出来了,可发送其他请求则会报404...

代码搬运工丶
2018/11/16
346
1
Spring Boot入门资料整理

Spring Boot 初识 SpringBoot前世今生 本文主要讲述spring boot的由来,即其它诞生的背景,初衷,现状,及对未来的展望。 Spring Boot参考指南中文版--Chapter1.Spring Boot中文文档 本节提供...

小致dad
2017/11/07
603
0
SpringBootBucket 1.0.0 发布,SprintBoot 全家桶

Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。 本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通过“一...

一刀
2018/03/05
9.3K
17

没有更多内容

加载失败,请刷新页面

加载更多

应急广播户户通平台

一、平台概述 应急广播户户通平台为软硬一体化广播服务解决方案。实现了应急广播、视音频及图片文字信息、调频及数字广播FM、天气预报信息接收功能,以及视音频播放、智能机器人、电子日历等...

neocean
今天
83
0
如何为Apache 2.2启用mod_rewrite

我已经在我的Vista机器上安装了新的Apache 2.2,一切正常,除了mod重写。 我没有注释 LoadModule rewrite_module modules/mod_rewrite.s 但是我的重写规则都没有,即使是简单的重写规则 Re...

javail
今天
23
0
移除Python unicode字符串中的重音符号的最佳方法是什么?

我在Python中有一个Unicode字符串,我想删除所有的重音符号(变音符号)。 我在网上发现了一种用Java实现此目的的优雅方法: 将Unicode字符串转换为长规范化格式(带有单独的字母和变音符号)...

技术盛宴
今天
48
0
ActiveMQ学习之SpringBoot整合ActiveMQ------>主题生产者和消费者

一、pom <!--聚合工程集成关系--> <!--统一整合第三方框架依赖信息--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</a......

冥焱
今天
89
0
两周自制脚本语言-第11天 优化变量读写性能

第11天 优化变量读写性能 以变量值的读写为例,向读者介绍基于这种理念的语言处理器性能优化方式。 11.1 通过简单数组来实现环境 假如函数包含局部变量x与y,程序可以事先将x设为数组的第0个...

果汁分你一半
今天
62
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部