我有一个简单的rest api,实现了单个GET方法。我想用springfox和swagger记录它。一切都很容易期待样品反应。
默认情况下,springfox使用基于反射的序列化程序 - 生成一个包含java类所有公共字段的简单json - 我想更改此行为并使用自定义序列化程序。
这是我的控制器(大部分代码都是为了提问而简化):
@RestController
public class Controller {
@RequestMapping( value = "/GetResponse", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, method = RequestMethod.GET )
public Response getResponse( ) {
return Response.randomInstance();
}
}
响应类是运行时生成的 - 我无法编辑/修改该类,因此像@ApiModelProperty这样的注释是不可行的。默认情况下,我使用自定义序列化程序(StaticResponseConverter也是自动生成的):
@JsonComponent
public class Serializer extends JsonSerializer<Response> {
@Override
public void serialize(Response response, JsonGenerator generator, SerializerProvider provider)
throws IOException {
generator.writeRaw( StaticResponseConverter.toJson(response) );
}
}
此序列化程序对常规api调用没有任何问题。但是,在生成样本响应时,swagger2不会使用它。
Swagger配置:
@Configuration
@EnableSwagger2
public class SwaggerConfig
{
@Bean
public Docket api()
{
return new Docket( DocumentationType.SWAGGER_2 ).select()
.apis( x -> x.declaringClass().equals( Controller.class ) ).paths( PathSelectors.any() )
.build();
}
}
我试过这种方法:
Spingfox not recognizing custom serializer when generating JSON model for swagger
还有这种方法,但我无法将其应用于springfox。
Swagger is it possible to override custom object serialization
Maven config:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
</dependency>
如何在为swagger-ui.html生成样本响应时使springfox / swagger使用我的自定义json序列化程序。
答案 0 :(得分:0)
我使用this answer中提供的方法,通过以下方式提供模型:
directModelSubstitute
或genericModelSubsitute
或这样做有助于springfox架构推理引擎无法推断。使用序列化器对jackson来说是不透明的,因此对springfox也是如此。这是因为通过检查串行器的实现,很难知道如何通过线路对特定类型进行序列化/反序列化。