1 导入需要的jar包
<!--swagger2的jar包-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<!-- 其中依赖了 hibernate.validator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.整合swagger2
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;
/**
* @author Administrator
* @create 2018-09-12 15:16
**/
@Configuration
@EnableSwagger2
public class Swagger2 {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.sungrow.modular.marchine.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("springboot利用swagger构建api文档")
.description("简单优雅的restfun风格")
.termsOfServiceUrl("xxx")
.version("2.9.2")
.build();
}
}
3.封装基本请求参数对象
import com.alibaba.druid.util.StringUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotNull;
/**
* @author shihaifeng
* @date 2019-07-29 8:54
* @desc 请求头的基础参数
**/
@ApiModel
public class RequestBaseParam<T> {
/**
* 用户定位区域编码
*/
/*@NotNull(message = "area不能为空")
@Length(min = 6, max = 6, message = "area长度为6")
@ApiModelProperty(value = "用户定位区域编码")
private String area;*/
/**
* 提交的数据进行base64签名,针对敏感接口(支付)采用对称加密算法进行加密
*/
/*@ApiModelProperty(value = "data")
private String data;*/
/**
* 客户端根据一定规则生成的md5验证码,以保证数据访问的安全性; Sign值32位,不为空
*/
@NotNull(message = "sign不能为空")
@Length(min = 32, max = 32, message = "sign长度为32")
@ApiModelProperty(value = "sign")
private String sign;
/**
* 时间戳:客户端生成加密值时的时间戳;加一位设备类型 时间戳(13位)+设备类型(1位)共14位,不为空
*/
@NotNull(message = "tt不能位空")
@Length(min = 14, max = 14, message = "tt长度为14")
@ApiModelProperty(value = "时间戳")
private String tt;
/**
* 用户ID, 可为空
*/
@ApiModelProperty(value = "用户ID")
private Integer uid;
/**
* 泛型:自定义请求参数实体对象
*/
private T t;
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getTt() {
return tt;
}
public void setTt(String tt) {
this.tt = tt;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public String transfer(){
StringBuilder builder = new StringBuilder();
if(!StringUtils.isEmpty(tt)){
builder.append("tt=").append(tt).append("&");
}
if(uid != null){
builder.append("uid=").append(uid).append("&");
}
return builder.toString();
}
}
4.使用aop拦截异常
import org.sg.tools.response.APIResponse;
import org.sg.tools.response.ResponseHandle;
import org.sg.tools.util.CommTools;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* @author shihaifeng
* @date 2019-07-29 16:41
* @desc 用来处理参数绑定绑定异常的全局处理器
**/
@RestControllerAdvice
public class BizExceptionHandler {
/**
* 接收异常,返回给客户端json格式
* @param e
* @return
*/
@ExceptionHandler(BindException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public APIResponse bindException(BindException e) {
APIResponse apiResponse = new APIResponse();
BindingResult bindingResult = e.getBindingResult();
String errorMesssage = "校验失败:";
for (FieldError fieldError : bindingResult.getFieldErrors()) {
errorMesssage += fieldError.getDefaultMessage() + ", ";
}
/**
* 把错误结果集封装给客户
*/
apiResponse = ResponseHandle.getInstance().exception2APIResponse("400",
errorMesssage,
CommTools.getExceptionStackTraceStr(e)) ;
return apiResponse;
}
}
4.测试接口
import com.sungrow.common.api.RequestBaseParam;
import com.sungrow.common.constant.ErrCodeEnum;
import com.sungrow.modular.marchine.dto.MachineLargeAreaQueryDTO;
import com.sungrow.modular.marchine.entity.MachineLargeArea;
import com.sungrow.modular.marchine.service.IMachineLargeAreaService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.log4j.Log4j2;
import org.sg.tools.response.APIResponse;
import org.sg.tools.response.ResponseHandle;
import org.sg.tools.util.CommTools;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
/**
* <p>
* 大区表 前端控制器
* </p>
*
* @author shiye
* @since 2019-07-26
*/
@Controller
@RequestMapping("/marchine/machineLargeArea")
@Log4j2
@Api(value = "大区管理接口")
public class MachineLargeAreaController {
@Autowired
private IMachineLargeAreaService machineLargeAreaService ;
/**
* 获取所有大区详细信息
* @param areaQuery
* @param result
* @return
*
* @Validated 注解一定要加;不然不会对参数进行校验
* APIResponse 返回值自己处理(这里是我自己定义的)
*/
@ApiOperation(value="获取所有大区详细信息", notes="获取所有大区详细信息")
@PostMapping("/getAllArea")
@ResponseBody
public APIResponse getAllArea(@Validated RequestBaseParam<MachineLargeAreaQueryDTO> areaQuery){
APIResponse apiResponse = new APIResponse();
List<MachineLargeArea> list = machineLargeAreaService.list(null);
try {
apiResponse = ResponseHandle.getInstance().data2APIResponse(list);
} catch (Exception e) {
apiResponse = ResponseHandle.getInstance().exception2APIResponse(ErrCodeEnum.ERR_CODE__1.getErrCode(),
ErrCodeEnum.ERR_CODE__1.getErrMsg(),
CommTools.getExceptionStackTraceStr(e)) ;
log.error(e.getMessage(),e);
}
return apiResponse;
}
}
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3amwcuixvxycs