ããã«ã¡ã¯ãã¨ããµã¤ãæ ªå¼ä¼ç¤¾ã®å¹³ç³ã§ãã
ä»åã¯ãSpringdocã§APIã®ãªã¯ã¨ã¹ãã«å¯¾ãã¦ãä»ä¸ããã¢ããã¼ã·ã§ã³ããç´¹ä»ãã¾ãã
ãªããä»åã®ã½ã¼ã¹ã³ã¼ãã¯ä»¥ä¸ã®ç°å¢ã§åä½ç¢ºèªããã¦ãã¾ãã
'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'
- Java 21
- SpringBoot 3.2.2
ã¯ããã«
Springdocã¯OpenAPIä»æ§ã®APIããã¥ã¡ã³ããèªåã§çæãã¦ãããã©ã¤ãã©ãªã§ãã
ããã¥ã¡ã³ããæ¸ãæéãçãã¾ãããSwagger UIãå©ç¨ããã°APIã®åä½ç¢ºèªãã§ããã®ã§ãäºæ¥é¨ã§ãç©æ¥µçã«æ´»ç¨ãã¦ãã¾ãã
Springdocã§ã¯ãControllerãè¨è¿°ããã ãã§æä½éã®ããã¥ã¡ã³ããä½æãã¦ããã®ã§ãããã©ã¤ãã©ãªã§æä¾ãããå°ç¨ã®ã¢ããã¼ã·ã§ã³ãä»ä¸ãããã¨ã§ãæ
å ±ãè£è¶³ãããã¨ãã§ãã¾ãã
ç¹ã«ãControllerãæ¸ãã ãã§ã¯ãã©ã®ãããªåä½ãããAPIãªã®ãã®èª¬æããããããã®ãã©ã¡ã¼ã¿ãã¬ã¹ãã³ã¹ã®è©³ç´°ãªèª¬æãã¨ãã£ãæ
å ±ã¯è¡¨ç¤ºããã¾ããã®ã§ãã¢ããã¼ã·ã§ã³ãå©ç¨ãã¦è£è¶³ããå¿
è¦ãããã¾ãã
ä¾ãã°ã以ä¸ã®ãããªControllerãä½æããã¨ãã¾ãã
@RestController @RequestMapping("sample") @Tag(name = "sample") public class SampleController { @GetMapping @Operation(summary = "ãµã³ãã«ã®API") @ApiResponses(value = { @ApiResponse( responseCode = "201", description = "æ£å¸¸ã«å¦çãçµäºããå ´å" ), @ApiResponse( responseCode = "500", description = "APIå é¨ã§ã¨ã©ã¼ãçºçããå ´å" ) }) public String sample() { return "Hello, Excite"; } }
ãã®æãSwagger UIã確èªããã¨ä»¥ä¸ã®ããã«åæ ããã¦ãã¾ãã
ãµã³ãã«ã®API
ãæ£å¸¸ã«å¦çãçµäºããå ´å
ã¨ãã£ãæè¨ã¯ã¢ããã¼ã·ã§ã³ã§è£è¶³ããªãã¨åæ ãããªãå
容ã§ãã
@Schemaãä¹±ç¨ãã¦çºçããåé¡
ããã¾ã§ãç§ã®æå±ãããã¼ã ã§ã¯Springdocã§APIã®æ
å ±ãè£è¶³ããéã«ããªã¯ã¨ã¹ãã«ãã¬ã¹ãã³ã¹ã«ã@Schema
ã®ã¿ãä»ä¸ãã¦ãã¾ããã
@Schema
ã¯OpenAPIä»æ§ä¸ã§ãã¼ã¿ã¢ãã«ãå®ç¾©ããããã«ä½¿ãããã¢ããã¼ã·ã§ã³ã§ãã
ãã¼ã¿ã¢ãã«ã¨è¨ãã¤ã¤ããåä¸ã®ãã£ã¼ã«ãããã©ã¡ã¼ã¿ã表ç¾ããã®ã«ã使ç¨ãããã¨ãã§ãã¾ãã
ãããã@Schema
åä½ã§ã¯ãªã¯ã¨ã¹ãã®éã«é©åã«åãåæ ãããªãã¨ããåé¡ãããã¾ããã
ä¾ãã°ã以ä¸ã®ãããªControllerãèãã¾ãã
@RestController @RequestMapping("sample") @Tag("sample") public class SampleController { @GetMapping public String sample( @ParameterObject SampleRequestDto requestDto ) { return "Hello, Excite!"; } }
SampleResponseDtoã«ã¯ãããããæ§ã ãªãã£ã¼ã«ããè¨è¿°ãã¦ããã¾ãã
ãªã¯ã¨ã¹ãã®å ´å
APIã®ãªã¯ã¨ã¹ãã¯ãControllerå
ã®ã¡ã½ããã®å¼æ°ã«String
ãInteger
ã®ç¶æ
ã§ç´æ¥æ¸¡ããã¨ãã§ãã¾ãããå
¨ã¦ã®ãã©ã¡ã¼ã¿ãã¾ã¨ããDTOã渡ããã¨ãã§ãã¾ãã
ä»åã¯ãDTOãä½æãã¦ã¿ã¾ãã
Javaã®ã¬ã³ã¼ãã»ã¯ã©ã¹ãå©ç¨ããã¨ä¾¿å©ã§ãã
public record SampleRequestDto(
String stringField,
Integer integerField,
Long longField
) {
}
ãã®ç¶æ ã§Swagger UIã確èªãã¦ã¿ã¾ãã
åãã©ã¡ã¼ã¿ãèªèãããåãJavaå´ã§å®£è¨ããåããOpenAPIä»æ§ã§å®ç¾©ããã¦ããåã«èªåã§å¤æãã¦ããã¦ãã¾ãã
ã¡ãªã¿ã«ã()å
ã«$ãã¼ã¯ã¨ä¸ç·ã«è¨è¿°ããã¦ããint32
ãdate-time
ã¯format
ã§ãã
integer($int64)
ã¯integer
ã¨ããtypeï¼åï¼ã®$int64
ã¨ãããã©ã¼ãããã§ãããã¨ã表ãã¦ãã¾ãã
int64
ã¯Longåã®ãã¨ãªã®ã§ãJavaã®åãOpenAPIä»æ§ã§å©ç¨ã§ããé©åãªåï¼+ ãã©ã¼ãããï¼ã«èªåçã«å¤æããã¦ãããã¨ããããã¾ãã
ã§ã¯ããªã¯ã¨ã¹ãã«ãdescription
ãexample
ãè¨è¿°ãã¦æ
å ±ãè£è¶³ãã¦ã¿ã¾ãã
public record SampleRequestDto( @Schema(description = "æååã®ãã©ã¡ã¼ã¿", example = "æåå") String stringField, @Schema(description = "Integeråã®ãã©ã¡ã¼ã¿", example = "1") Integer integerField, @Schema(description = "Longåã®ãã©ã¡ã¼ã¿", example = "2") Long longField ) { }
Swagger UIã確èªãã¦ã¿ã¾ãã
ããï¼ç¢ºãã«ãDescription
ã§ã³ã¡ã³ãã«ããè£è¶³ã¯åæ ããã¦ãã¾ãããåãå
¨ã¦string
ã«ãªã£ã¦ãã¾ã£ã¦ãã¾ãã
Springdocã§ã¯ãªã¯ã¨ã¹ããã©ã¡ã¼ã¿ã§ã¯@Schema
ã§è£è¶³æ
å ±ãå ãããã¨ããã¨ãåãèªåã§å¤æãããã¨ãã§ããå
¨ã¦string
ã«ãªã£ã¦ãã¾ãããã§ãã
ãã®ä»æ§ãè¬ã§ãã£ããããå
¬å¼ããã¥ã¡ã³ããçºãã¦ããã¨ãªã¯ã¨ã¹ããã©ã¡ã¼ã¿ã®æã«ã¯@Parameter
ã¨ããã¢ããã¼ã·ã§ã³ãå©ç¨ããã¨è¯ãããã§ãã
@Parameter
ã§ãdescription
ãexample
ããã®ã¾ã¾æå®ãããã¨ãåºæ¥ã¾ãã
public record SampleRequestDto( @Parameter(description = "æååã®ãã©ã¡ã¼ã¿", example = "æåå") String stringField, @Parameter(description = "Integeråã®ãã©ã¡ã¼ã¿", example = "1") Integer integerField, @Parameter(description = "Longåã®ãã©ã¡ã¼ã¿", example = "2") Long longField ) { }
Swagger UIã確èªãã¦ã¿ã¾ãã
ä»åº¦ã¯ãåãåæ ããã¦ãã¾ãã
@Parameter
ã§ã¯ãã©ã¡ã¼ã¿ãå
¥ããå ´æï¼ããããã¯ã¨ãªãã©ã¡ã¼ã¿çï¼ãæå®ããin
ã空ã®å¤ã許å¯ãããã©ããã示ãallowEmptyValue
ãªã©ã®ããã«ããªã¯ã¨ã¹ããã©ã¡ã¼ã¿ã«ç¹åããå±æ§å¤ãã»ãããããã¨ãã§ãããããä»å¾ã¯ãã¡ããå©ç¨ãã¦ããããã¨æãã¾ãã
ãããã«
ä»åã¯ãSpringdocã§ã¢ããã¼ã·ã§ã³ãå©ç¨ãã¦æ
å ±ãä»å ããã¨ãã«ããªã¯ã¨ã¹ããã©ã¡ã¼ã¿ã«ã¯@Parameter
ãå©ç¨ãã¹ãã§ãããã¨ãç´¹ä»ãã¾ããã
ã§ã¯ãã¾ã次åã