springboot整合swagger-bootstrap-ui,过滤器放开并解决自定义错误信息返回冲突

1.引入swagger依赖包

     <!-- swagger -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.9.3</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>

在启动类上添加@EnableSwagger2注解

2.Swagger配置类

import org.springframework.context.annotation.Bean;
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
public class SwaggerConfiguration {


//    @Bean
//    public Docket createRestApi() {
//        return new Docket(DocumentationType.SWAGGER_2)
//                .apiInfo(apiInfo())
//                .groupName("资源管理")
//                .select()
//                .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
//                .paths(PathSelectors.any())
//                .build();
//    }
//
//    @Bean
//    public Docket createMonitorRestApi() {
//        return new Docket(DocumentationType.SWAGGER_2)
//                .apiInfo(apiInfo())
//                .groupName("实时监测")
//                .select()
//                .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
//                .paths(PathSelectors.any())
//                .build();
//    }
//
//    @Bean
//    public Docket createActivitiRestApi() {
//        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
//                .groupName("工作流引擎")
//                .select()
//                .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
//                .paths(PathSelectors.any())
//                .build();
//    }
//
//    @Bean
//    public Docket createBaseRestApi() {
//        return new Docket(DocumentationType.SWAGGER_2)
//                .apiInfo(apiInfo())
//                .groupName("kernel模块")
//                .select().apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
//                .paths(PathSelectors.any())
//                .build();
//    }
//
    @Bean
    public Docket createComplaintRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("api接口文档")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("测试标题头部")
                .description("测试描述信息")
                .termsOfServiceUrl("http://plat.xunlinkeji.cn")
                .contact("甘小涛")
                .version("1.0")
                .build();
    }
}

3.过滤器

import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
@WebFilter(urlPatterns = {"/*"}, filterName = "accessFilter")
public class AccessFilter
        implements Filter {
    private static final Logger log = LoggerFactory.getLogger(Filter.class);
    //这里配置不过滤的路径,支持模糊查询
    private static final String NOT_FILTER_STR = "/login|/photoUpload|/img/|/loginOut|/api/login|" +
            "/importExcel|/api/upload/pic|/api/deviceGis/add|user|/doc.html|swagger|.ico|.js|.css|/v2/api-docs";
    private static List<String> NOTFILTER_ARRAY;

    public AccessFilter() {
        NOTFILTER_ARRAY = Arrays.asList(NOT_FILTER_STR.split("\\|"));
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Methods", "HEAD, POST, GET, OPTIONS, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        String currentURL = request.getRequestURI();
        boolean isNotLogin = false;
        for (String str : NOTFILTER_ARRAY) {
            isNotLogin = currentURL.contains(str);
            if (isNotLogin) {
                break;
            }
        }
        if (!isNotLogin)
        {
            return;
        }
        chain.doFilter(req, res);
    }

    public void init(FilterConfig arg0)
            throws ServletException {
    }
}

这里主要是放行请求路径包含有swagger和v2的路径,这些是swagger生成页面需要请求的路径

4.自定义返回的错误信息

前面的内容很简单,因为我项目里需要自定义错误返回的json数据,所以访问http://localhost:8080/swagger-ui.html会把swagger-ui.html当成接口去查找,最后返回404

解决方案


import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

@Controller("/error")
@RequestMapping("${server.error.path:${error.path:/error}}")
public class CustomizeErrorController implements ErrorController {
    @Override
    public String getErrorPath() {
        return "error";
    }

    @RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
    @ResponseBody
    public String errorHtml(HttpServletRequest request){
        HttpStatus status = getStatus(request);

        if(status.is4xxClientError()){
           return "未找到该路径";

        }
        if (status.is5xxServerError()){
            return"服务器内部异常";
        }

        return "未知错误";
    }

    private HttpStatus getStatus(HttpServletRequest request){
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if(statusCode == null){
            return HttpStatus.INTERNAL_SERVER_ERROR;
        }
        try {
            return  HttpStatus.valueOf(statusCode);
        }catch (Exception ex){
            return HttpStatus.INTERNAL_SERVER_ERROR;
        }
    }
}

5.Controller

import com.example.demo.entity.User;
import com.example.demo.util.ResultData;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import java.util.List;
import java.util.Map;

/**
 * @author zh
 * @ClassName cn.saytime.web.UserController
 * @Description
 */
@RestController
@Api(tags = {"用户操作接口"})
public class UserController {


    /**
     * 根据ID查询用户
     *
     * @param param
     * @return
     */
    @ApiOperation(value = "获取用户详细信息", notes = "根据url的id来获取用户详细信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "用户ID", required = true, paramType = "query", dataType = "Long", example = "123"),
            @ApiImplicitParam(name = "name", value = "用户名称", required = true, paramType = "query", dataType = "String", example = "aa")
    })
    @RequestMapping(value = "user", method = RequestMethod.GET)
    public ResultData<List<User>> getUserById(@ApiIgnore @RequestParam Map<String, Object> param) {

        List<User> list = Lists.newArrayList();
        list.add(new User(1, "小明"));
        list.add(new User(2, "小红"));
        ResultData resultData = new ResultData();
        resultData.setCode("200");
        resultData.setMessage("成功");
        resultData.setSuccess(true);
        resultData.setData(list);
        return resultData;

    }
//
//	/**
//	 * 查询用户列表
//	 * @return
//	 */
//	@ApiOperation(value="获取用户列表", notes="获取用户列表")
//	@RequestMapping(value = "users", method = RequestMethod.GET)
//	public ResponseEntity<JsonResult> getUserList (){
//		JsonResult r = new JsonResult();
//		try {
//			List<User> userList = new ArrayList<User>(users.values());
//			r.setResult(userList);
//			r.setStatus("ok");
//		} catch (Exception e) {
//			r.setResult(e.getClass().getName() + ":" + e.getMessage());
//			r.setStatus("error");
//			e.printStackTrace();
//		}
//		return ResponseEntity.ok(r);
//	}
//
//	/**
//	 * 添加用户
//	 * @param user
//	 * @return
//	 */
//	@ApiOperation(value="创建用户", notes="根据User对象创建用户")
//	@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
//	@RequestMapping(value = "user", method = RequestMethod.POST)
//	public ResponseEntity<JsonResult> add (@RequestBody User user){
//		JsonResult r = new JsonResult();
//		try {
//			users.put(user.getId(), user);
//			r.setResult(user.getId());
//			r.setStatus("ok");
//		} catch (Exception e) {
//			r.setResult(e.getClass().getName() + ":" + e.getMessage());
//			r.setStatus("error");
//
//			e.printStackTrace();
//		}
//		return ResponseEntity.ok(r);
//	}
//
//	/**
//	 * 根据id删除用户
//	 * @param id
//	 * @return
//	 */
//	@ApiOperation(value="删除用户", notes="根据url的id来指定删除用户")
//	@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long", paramType = "path")
//	@RequestMapping(value = "user/{id}", method = RequestMethod.DELETE)
//	public ResponseEntity<JsonResult> delete (@PathVariable(value = "id") Integer id){
//		JsonResult r = new JsonResult();
//		try {
//			users.remove(id);
//			r.setResult(id);
//			r.setStatus("ok");
//		} catch (Exception e) {
//			r.setResult(e.getClass().getName() + ":" + e.getMessage());
//			r.setStatus("error");
//
//			e.printStackTrace();
//		}
//		return ResponseEntity.ok(r);
//	}
//
//	/**
//	 * 根据id修改用户信息
//	 * @param user
//	 * @return
//	 */
//	@ApiOperation(value="更新信息", notes="根据url的id来指定更新用户信息")
//	@ApiImplicitParams({
//			@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long",paramType = "path"),
//			@ApiImplicitParam(name = "user", value = "用户实体user", required = true, dataType = "User")
//	})
//	@RequestMapping(value = "user/{id}", method = RequestMethod.PUT)
//	public ResponseEntity<JsonResult> update (@PathVariable("id") Integer id, @RequestBody User user){
//		JsonResult r = new JsonResult();
//		try {
//			User u = users.get(id);
//			u.setUsername(user.getUsername());
//			u.setAge(user.getAge());
//			users.put(id, u);
//			r.setResult(u);
//			r.setStatus("ok");
//		} catch (Exception e) {
//			r.setResult(e.getClass().getName() + ":" + e.getMessage());
//			r.setStatus("error");
//
//			e.printStackTrace();
//		}
//		return ResponseEntity.ok(r);
//	}
//
//	@ApiIgnore//使用该注解忽略这个API
//	@RequestMapping(value = "/hi", method = RequestMethod.GET)
//	public String  jsonTest() {
//		return " hi you!";
//	}
}

访问http://localhost:8080/doc.html

效果

猜你喜欢

转载自blog.csdn.net/qq_38279833/article/details/100836784