1) 依存関係の追加 バージョン 3.0.0 を使用すると swagger-ui ページ 404 の問題が発生するため、2.9.2 に変更しました デフォルトバージョンの swagger-model を使用すると空判定例外が発生します。
<!-- swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.21</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
2) スワガーインジェクション構成
必要なだけ Dockets を挿入し、有効にするための構成ファイルを使用し、動作環境に応じて有効にするかどうかを決定します。通常、Swagger は運用環境では有効にしないでください。
package com.example.jiakao.common.config;
import com.example.jiakao.common.prop.ProjProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;
@Configuration
@EnableSwagger2
public class SwaggerCfg {
private static final String VERSION = "1.0.0";
@Autowired
private ProjProperties properties;
@Bean
public Docket docket(){
return basicDocket("all")
.apiInfo(apiInfo("接口文档","详细接口文档"))
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
.build();
}
@Bean
public Docket dictDocket(){
return basicDocket("dict","/(dict.*)")
.apiInfo(apiInfo("dict接口文档","dict详细接口文档"));
}
private ApiInfo apiInfo(String title, String description){
ApiInfoBuilder builder = new ApiInfoBuilder();
builder.title(title);
builder.description(description);
builder.version(VERSION);
return builder.build();
}
private Docket basicDocket(String name){
Parameter token = new ParameterBuilder()
.name("Token")
.description("用户登录令牌")
.parameterType("header")
.modelRef(new ModelRef("String"))
.build();
return new Docket(DocumentationType.SWAGGER_2)
.ignoredParameterTypes(HttpSession.class, HttpServletRequest.class, HttpServletResponse.class)
.groupName(name)
.enable(properties.getSwagger());
// .globalOperationParameters(List.of(token));
}
private Docket basicDocket(String name, String regex){
return basicDocket(name)
.select()
.paths(PathSelectors.regex(regex))
.build();
}
}
3) 一般的なアノテーション
4) プロジェクトの構造は完璧です
データベース po オブジェクトは vo オブジェクトから分離する必要があり、swagger 構成は po オブジェクトと混合するのではなく、vo オブジェクト上でマークする必要があります。
po オブジェクト、データベース操作に使用されます
package com.example.jiakao.pojo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import javax.persistence.*;
@Entity
@Data
@TableName("plate_region")
@Table(name="plate_region")
public class PlateRegionPo {
@Id
@TableId(type = IdType.AUTO)
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column( columnDefinition = "int4" )
private Integer id;
@Column( columnDefinition = "varchar(64)" )
private String name;
@Column( columnDefinition = "varchar(64)" )
private String plate;
@Column( columnDefinition = "int4 default 0 " )
private Integer parentId;
}
vo オブジェクト。保存時にパラメータを渡すために使用されます。
package com.example.jiakao.pojo.vo.req.save;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("保存一个省份或者城市信息的参数")
public class PlateRegionReqVo {
@ApiModelProperty(value = "省份或者城市的id")
private Integer id;
@ApiModelProperty(value = "省份或者城市的名称", required = true)
private String name;
@ApiModelProperty(value = "省份或者城市的代号", required = true)
private String plate;
@ApiModelProperty(value = "城市所属省份的id,省份为0,默认值为0", required = true)
private Integer parentId = 0;
}
パラメータは po オブジェクトから分離されるため、大量の vo から po への変換が必要になりますが、ここでは、mapstruct を使用して変換プロセスを簡素化できます。
<!-- 对象转换,编译期间存在-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.3.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.3.Final</version>
<scope>provided</scope>
</dependency>
vo と po の間で変換する際、ある型を別の型に変換したり、フィールド名が不一致になったりすることがありますが、このとき MapStrcut の Mapping アノテーションを利用することができます。
@Mapping(source = "createTime",target="createTime",qualifiedBy = MapStructFormatter.Date2Millis.class)
qualifiedBy 属性は、Date2Millis アノテーションを持つ型変換に使用されるメソッドを指定します。アノテーションと変換メソッドは以下に定義されています。アノテーションには必ず @Qualifier アノテーションを付けることが規定されています。@Retention(RetentionPolicy.CLASS) は、アノテーションがコンパイル中にのみ機能することを意味します。@Target(ElementType.METHOD) は、メソッド上でアノテーションをマークする必要があることを示します。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Date;
public class MapStructFormatter {
@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface Date2Millis {
}
@Date2Millis
public static Long date2millis(Date date){
if(date == null) return null;
return date.getTime();
}
@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface Millis2Date {
}
@Millis2Date
public static Date millis2date(Long timeStamp){
if(timeStamp == null) return null;
return new Date(timeStamp);
}
}
使用方法は、ジェネリック医薬品を使用しないでください。@Mapper(uses = {MapStructFormatter.class}) は、変換メソッドを検索するクラスを表します。qualifiedBy = MapStructFormatter.Date2Millis.class) は、Date2Millis アノテーションが付けられたメソッドを型変換に使用する必要があることを示します。
package com.example.jiakao.common.mapStruct;
import com.example.jiakao.pojo.entity.*;
import com.example.jiakao.pojo.vo.list.UserVo;
import com.example.jiakao.pojo.vo.req.save.*;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper(uses = {
MapStructFormatter.class
})
public interface MapStructs {
// 接口中的属性只能是public static,可以省略
MapStructs INSTANCE = Mappers.getMapper(MapStructs.class);
@Mapping(source = "createTime",target="createTime",qualifiedBy = MapStructFormatter.Date2Millis.class)
@Mapping(source = "updateTime",target="updateTime",qualifiedBy = MapStructFormatter.Date2Millis.class)
UserVo po2vo(UsersPo po);
ExamPlacePo reqVo2po(ExamPlaceReqVo vo);
PlateRegionPo reqVo2po(PlateRegionReqVo vo);
ExamCoursePo reqVo2po(ExamCourseReqVo po);
UsersPo reqVo2po(UsersReqVo po);
RolesPo reqVo2po(RolesReqVo po);
ResourcePo reqVo2po(ResourceReqVo po);
}
同時に、BaseController の抽象クラスを抽出して、いくつかの基本的なインターフェイスを実装できます。
package com.example.jiakao.controller;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.jiakao.common.constant.ResultCode;
import com.example.jiakao.exception.http.ArgumentsException;
import com.example.jiakao.common.util.Vos;
import com.example.jiakao.pojo.vo.json.JsonVo;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Arrays;
/**
*
* @param <Po> 数据库entity类
* @param <ReqVo> pojo.vo.req.save中的类,用于插入数据库的请求参数,非entity
*/
public abstract class BaseController<Po, ReqVo> {
protected abstract IService<Po> getService();
protected abstract Po reqVo2Po(ReqVo reqVo);
@ApiOperation("删除一条数据或多条数据")
@PostMapping("/remove")
public JsonVo remove(
@ApiParam(value = "一个或多个id,以逗号分割",required = true)
@RequestParam String id){
String[] ids = id.split(",");
if(getService().removeByIds(Arrays.asList(ids))){
return Vos.ok();
} else{
throw new ArgumentsException(ResultCode.ARGUMENTS_ERROR);
}
}
@ApiOperation("保存一条数据")
@PostMapping("/save")
public JsonVo save(@RequestBody ReqVo vo) {
Po entity = reqVo2Po(vo);
if(getService().saveOrUpdate(entity)){
return Vos.ok();
} else{
throw new ArgumentsException(ResultCode.ARGUMENTS_ERROR);
}
}
}
ディレクトリ構造