【问题标题】:swagger-ui not working with custom XML ObjectMapperswagger-ui 不适用于自定义 XML ObjectMapper
【发布时间】:2018-09-20 00:41:36
【问题描述】:

我正在开发一个应该启用 swagger-ui 的 Spring Boot 应用程序。 访问http://localhost:8080/swagger-ui.html时弹出错误: “无法推断基本 url ...”

另外,http://localhost:8080/v2/api-docs 显示: 第 1 行第 1 列的错误:文档为空 本页源代码为json,但请求为Content-Type application/xhtml+xml;charset=UTF-8

这似乎是我自定义 Jackson 配置的原因:

@Configuration
public class JacksonConfig {

@Bean
public MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter() {
    return new MappingJackson2XmlHttpMessageConverter(objectMapper());
}

@Bean
public ObjectMapper objectMapper() {
    JacksonXmlModule xmlModule = new JacksonXmlModule();
    xmlModule.setDefaultUseWrapper(false);
    XmlMapper objectMapper = new XmlMapper(xmlModule);
    objectMapper
            .registerModule(new ParameterNamesModule())
            .registerModule(new Jdk8Module())
            .registerModule(new JavaTimeModule());
    objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
    objectMapper
            .configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false)
            .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);

    return objectMapper;
}
}

具有以下依赖关系:

<dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
    </dependency>

这里也描述了这个问题:https://github.com/springfox/springfox/issues/1835

所以我的问题是:如何指定杰克逊消息转换器的优先级以使 swagger-ui 正常工作?

【问题讨论】:

    标签: spring-boot swagger swagger-ui jackson-dataformat-xml


    【解决方案1】:

    我只是在重新阅读自己的问题时偶然发现了解决方案。

    只需将其添加到上面的 JacksonConfig 类(不知道排序是否重要,但它有效)。

    @Bean
    public MappingJackson2HttpMessageConverter jsonConverter() {
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        jsonConverter.setObjectMapper(objectMapper);
        return jsonConverter;
    }
    

    【讨论】:

      【解决方案2】:

      在 swagger 代码中,它会检查 ObjectMapper 是否存在,如果不存在,它会创建一个来使用。如果创建了一个使用 ObjectMapper 或 XMLMapper 的 bean,那么 Swagger 将使用这个实例,并被破坏。解决方法是为 ObjectMapper 创建一个 bean 并使用 @Primary 注释,然后创建您要使用的 XMLMapper bean。

      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.context.annotation.Primary;
      import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
      
      import com.fasterxml.jackson.databind.ObjectMapper;
      import com.fasterxml.jackson.databind.PropertyNamingStrategy;
      import com.fasterxml.jackson.dataformat.xml.XmlMapper;
      
      @Configuration
      public class MessageResponseXMLMapper {
      
      
            @Bean
            @Primary
            public ObjectMapper customObjectMapper() {
                  return new ObjectMapper();
            }
      
      
            @Bean(name="customXmlMapper")
            public XmlMapper customXmlMapper() {
                  return new Jackson2ObjectMapperBuilder()
                          .indentOutput(true)
                          .createXmlMapper(true)
                          .propertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE)
                          .build();     }   
      
      }
      

      希望对你有帮助

      【讨论】:

      • 这个解决方案的挑战 - 它假定ObjectMapper其他 使用比 Swagger 代码更具可配置性。如果两个代码库都只是从 bean 注册表中选择“默认”一个,我们如何解决这个问题?
      猜你喜欢
      • 2019-08-03
      • 1970-01-01
      • 2016-11-09
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多