前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swagger2+springboot-mvc+hibernate-validator 可视化视图加参数校验

Swagger2+springboot-mvc+hibernate-validator 可视化视图加参数校验

作者头像
用户5927264
发布2019-07-31 10:03:06
8370
发布2019-07-31 10:03:06
举报
文章被收录于专栏:OSChinaOSChina

1 导入需要的jar包

代码语言:javascript
复制
<!--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

代码语言:javascript
复制
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.封装基本请求参数对象

代码语言:javascript
复制
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拦截异常

代码语言:javascript
复制
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.测试接口

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档