springfox(swagger2)不适用于GsonHttpMessageConverterConfig

Ole*_*ski 7 gson swagger spring-boot springfox

我想要构建的是一个spring-boot(v1.2.3)应用程序,并使用SpringFox(swagger2)v2.0.0公开我的Rest API

我的Swagger Spring配置

@EnableSwagger2
@Configuration
public class SwaggerConfig {

    @Bean
    public Docket myApi() {
        return new Docket(DocumentationType.SWAGGER_2)
            .genericModelSubstitutes(DeferredResult.class)
            .useDefaultResponseMessages(false)
            .forCodeGeneration(false)
            .pathMapping("/my-prj");
    }

}
Run Code Online (Sandbox Code Playgroud)

我需要使用gson将我的pojo转换为json,我这样做:

@Configuration
public class GsonHttpMessageConverterConfig {

    @Bean
    public GsonHttpMessageConverter gsonHttpMessageConverter(Gson gson) {
        GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
        converter.setGson(gson);
        return converter;
    }
}
Run Code Online (Sandbox Code Playgroud)

麻烦的是,如果使用GsonHttpMessageConverter,swagger v2会生成错误的json:

{
"value": "{\"swagger\":\"2.0\",\"info\":{\"description\":\"Api Documentation\",\"version\":\"1.0\",\"title\":\"Api Documentation\",\"termsOfService\":\"urn:tos\",\"contact\":{\"name\":\"Contact Email\"},\"license\":{\"name\":\"Apache 2.0\",\"url\":\"http:
...
Run Code Online (Sandbox Code Playgroud)

JSON以value为前缀,真正的JSON成为转义字符串.

这是如果不使用它应该如何GsonHttpMessageConverter:

{
"swagger": "2.0",
"info": {
"description": "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a 
...
Run Code Online (Sandbox Code Playgroud)

有没有一个解决方案来创建一个没有价值和逃避的正确的swagger JSON?

Ole*_*ski 29

我自己解决了这个问题:

问题在于序列化这个类:

package springfox.documentation.spring.web.json;

import com.fasterxml.jackson.annotation.JsonRawValue;
import com.fasterxml.jackson.annotation.JsonValue;

public class Json {
  private final String value;

  public Json(String value) {
    this.value = value;
  }

  @JsonValue
  @JsonRawValue
  public String value() {
    return value;
  }
}
Run Code Online (Sandbox Code Playgroud)

序列化它是正确的我实现了一个SpringfoxJsonToGsonAdapter并将其添加到我的gson配置:

适配器:

public class SpringfoxJsonToGsonAdapter implements JsonSerializer<Json> {

    @Override
    public JsonElement serialize(Json json, Type type, JsonSerializationContext context) {
        final JsonParser parser = new JsonParser();
        return parser.parse(json.value());
    }
} 
Run Code Online (Sandbox Code Playgroud)

gson配置:

@Configuration
public class GsonHttpMessageConverterConfig {

    @Bean
    public GsonHttpMessageConverter gsonHttpMessageConverter() {
        GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
        converter.setGson(gson());
        return converter;
    }

    private Gson gson() {
        final GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(Json.class, new SpringfoxJsonToGsonAdapter());
        return builder.create();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 那是一些疯狂的体操!感谢您分享解决方案! (2认同)