Springブートを使用してREST APIを作成し、swagger codegenを使用してコントローラーでswaggerドキュメントを自動生成しています。ただし、POSTリクエストでString型のパラメーターの説明と例を設定することはできません。 miコードは次のとおりです。
import io.swagger.annotations.*;
@Api(value = "transaction", tags = {"transaction"})
@FunctionalInterface
public interface ITransactionsApi {
@ApiOperation(value = "Places a new transaction on the system.", notes = "Creates a new transaction in the system. See the schema of the Transaction parameter for more information ", tags={ "transaction", })
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Another transaction with the same messageId already exists in the system. No transaction was created."),
@ApiResponse(code = 201, message = "The transaction has been correctly created in the system"),
@ApiResponse(code = 400, message = "The transaction schema is invalid and therefore the transaction has not been created.", response = String.class),
@ApiResponse(code = 415, message = "The content type is unsupported"),
@ApiResponse(code = 500, message = "An unexpected error has occurred. The error has been logged and is being investigated.") })
@RequestMapping(value = "/transaction",
produces = { "text/plain" },
consumes = { "application/json" },
method = RequestMethod.POST)
ResponseEntity<Void> createTransaction(
@ApiParam(
value = "A JSON value representing a transaction. An example of the expected schema can be found down here. The fields marked with an * means that they are required." ,
example = "{foo: whatever, bar: whatever2}")
@Valid @RequestBody String kambiTransaction) throws InvalidTransactionException;
}
@ApiParamのサンプルプロパティは手動で挿入されました。codegenはyamlのその部分を無視していたためです(別の質問です。なぜエディターはサンプルの部分を無視するのですか?)。 yamlの一部です:
paths:
/transaction:
post:
tags:
- transaction
summary: Place a new transaction on the system.
description: >
Creates a new transaction in the system. See the schema of the Transaction parameter
for more information
operationId: createTransaction
parameters:
- $ref: '#/parameters/transaction'
consumes:
- application/json
produces:
- text/plain
responses:
'200':
description: Another transaction with the same messageId already exists in the system. No transaction was created.
'201':
description: The transaction has been correctly created in the system
'400':
description: The transaction schema is invalid and therefore the transaction has not been created.
schema:
type: string
description: error message explaining why the request is a bad request.
'415':
description: The content type is unsupported
'500':
$ref: '#/responses/Standard500ErrorResponse'
parameters:
transaction:
name: kambiTransaction
in: body
required: true
description: A JSON value representing a kambi transaction. An example of the expected schema can be found down here. The fields marked with an * means that they are required.
schema:
type: string
example:
{
foo*: whatever,
bar: whatever2
}
そして最後に、これがswaggerが示しているものです。
最後に、build.gradleで使用される依存関係は次のとおりです。
compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.7.0'
compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.7.0'
だから、質問は次のとおりです:スワッガー注釈を使用してボディパラメータの説明と例を設定する方法を知っている人はいますか?
EDIT
@ApiParamの代わりに@ApiImplicitParamを使用して説明を変更することができましたが、例はまだありません:
@ApiImplicitParams({
@ApiImplicitParam(
name = "kambiTransaction",
value = "A JSON value representing a transaction. An example of the expected schema can be found down here. The fields marked with * means that they are required. See the schema of KambiTransaction for more information.",
required = true,
dataType = "String",
paramType = "body",
examples = @Example(value = {@ExampleProperty(mediaType = "application/json", value = "{foo: whatever, bar: whatever2}")}))})
Bodyオブジェクトのサンプルを生成する際にも同様の問題があります-アノテーション@Example
および@ExampleProperty
はswagger 1.5.xでは理由もなく動作しません。 (1.5.16を使用)
私の現在のソリューションは次のとおりです。
use @ApiParam(example="...")
for non-body objects、例:
public void post(@PathParam("userId") @ApiParam(value = "userId", example = "4100003") Integer userId) {}
bodyオブジェクトは、新しいクラスを作成し、@ApiModelProperty(value = " ", example = " ")
でフィールドに注釈を付けます。例:
@ApiModel(subTypes = {BalanceUpdate.class, UserMessage.class})
class PushRequest {
@ApiModelProperty(value = "status", example = "Push")
private final String status;;
}
実際、@ApiParam
アノテーションのexample
プロパティのJava docは、これが非本体パラメーターにのみ使用されることを示しています。 examples
プロパティは、ボディパラメータに使用できます。
このアノテーションをテストしました
@ApiParam(
value = "A JSON value representing a transaction. An example of the expected schema can be found down here. The fields marked with an * means that they are required.",
examples = @Example(value =
@ExampleProperty(
mediaType = MediaType.APPLICATION_JSON,
value = "{foo: whatever, bar: whatever2}"
)
)
)
その結果、対応するメソッドに対して次のスワッガーが生成されました。
/transaction:
post:
...
parameters:
...
- in: "body"
name: "body"
description: "A JSON value representing a transaction. An example of the expected\
\ schema can be found down here. The fields marked with an * means that\
\ they are required."
required: false
schema:
type: "string"
x-examples:
application/json: "{foo: whatever, bar: whatever2}"
ただし、この値はswagger-uiによって取得されないようです。バージョン2.2.10と最新の3.17.4を試しましたが、どちらのバージョンもswaggerのx-examples
プロパティを使用しませんでした。
swagger-uiのコード にはx-example
(非ボディパラメータに使用されるもの)の参照がいくつかありますが、x-examples
には一致しません。これは、現時点ではswagger-uiでサポートされていないようです。
この例の値を本当に必要とする場合、現在の最良の選択肢は、メソッドのシグネチャを変更し、bodyパラメーターに専用のドメインタイプを使用することです。コメントで既に述べたように、swaggerはドメインタイプの構造を自動的に取得し、swagger-uiでニース情報を出力します。
以下を試しましたか?
@ApiModelProperty(
value = "A JSON value representing a transaction. An example of the expected schema can be found down here. The fields marked with an * means that they are required.",
example = "{foo: whatever, bar: whatever2}")
ごきげんよう
Swagger 2.9.2を使用している場合、サンプルはそこで機能しません。これらの注釈は無視されます
protected Map<String, Response> mapResponseMessages(Set<ResponseMessage> from) {
Map<String, Response> responses = newTreeMap();
for (ResponseMessage responseMessage : from) {
Property responseProperty;
ModelReference modelRef = responseMessage.getResponseModel();
responseProperty = modelRefToProperty(modelRef);
Response response = new Response()
.description(responseMessage.getMessage())
.schema(responseProperty);
**response.setExamples(Maps.<String, Object>newHashMap());**
response.setHeaders(transformEntries(responseMessage.getHeaders(), toPropertyEntry()));
Map<String, Object> extensions = new VendorExtensionsMapper()
.mapExtensions(responseMessage.getVendorExtensions());
response.getVendorExtensions().putAll(extensions);
responses.put(String.valueOf(responseMessage.getCode()), response);
}
return responses;
}
Swagger 3.0.0-Snapshotを使用してみてください。次のようにMavenの依存関係を変更する必要があります。
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-spring-webmvc</artifactId>
<version>3.0.0-SNAPSHOT</version>
</dependency>
swagger構成ファイルの注釈を次のように変更します:@ EnableSwagger2WebMvc