swagger-ui不使用自定义XML ObjectMapper

时间:2018-04-10 11:49:37

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

我正在使用应该启用了swagger-ui的spring boot应用程序。 访问http://localhost:8080/swagger-ui.html时会出现错误弹出窗口: "无法推断基本网址..."

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

原因似乎是我的自定义杰克逊配置:

@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

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

2 个答案:

答案 0 :(得分:0)

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

只需将其添加到上面的JacksonConfig课程中(不知道订购是否重要,但是有效)。

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

答案 1 :(得分:0)

在招摇代码中,它检查是否存在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();     }   

}

希望这会有所帮助