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
效果