2017-02-20 26 views
0

У меня есть простой априод для отдыха с использованием одного метода GET. Я хотел бы, чтобы это было документировано с использованием springfox и swagger. Все очень легко ожидать ответа образца.Определите пользовательский сериализатор json для springfox swagger2 для @ApiOperations

По умолчанию springfox использует сериализатор на основе отражений - создает простой json со всеми общедоступными полями класса java - я хотел бы изменить это поведение и использовать собственный сериализатор.

Вот мой контроллер (большая часть кода упрощена для вопроса):

@RestController 
public class Controller { 

@RequestMapping(value = "/GetResponse", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, method = RequestMethod.GET) 
    public Response getResponse() { 
     return Response.randomInstance(); 
    } 

} 

Response класс генерируется во время выполнения - я не могу редактировать/изменять этот класс, поэтому аннотации, как @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 при создании отклика образца.

Кураж конфигурации:

@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 конфигурация:

 <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> 

Как сделать springfox/чванство, чтобы использовать свой собственный JSon сериалайзер при генерации ответа выборки для развязности-ui.html.

+0

Я второй подход, приведенный в [этом ответе] (http://stackoverflow.com/a/39918957/19219). –

ответ

0

Я второй подход обеспечил в this answer для обеспечения модели с помощью:

  • directModelSubstitute или
  • genericModelSubsitute или
  • питания правила альтернативного типа.

То, что это делает, помогает движку вывода схемы springfox с тем, что он не может сделать. Использование сериализатора непрозрачно для джексона и, следовательно, для springfox. Это связано с тем, что очень трудно понять, как определенный тип сериализуется/десериализуется по проводу, проверяя реализацию сериализатора.

+0

К сожалению, я не могу предоставить замену модели, класс ответа синуса - это среда выполнения, сгенерированная одна (вместе с StaticResponseConverter). Забыл упомянуть об этом в вопросе, отредактирован. –

+0

Предоставлено, что он не будет использоваться как DTO, и его единственной целью существования было бы предоставить схему для ответа, вы все равно сможете создать фиктивный класс, который представляет собой сериализованный объект. Это похоже на [jackson Mixin] (http://wiki.fasterxml.com/JacksonMixInAnnotations) –