swagger-ui 无法使用自定义 XML ObjectMapper
swagger-ui not working with custom XML ObjectMapper
我正在开发一个 spring 启动应用程序,它应该启用 swagger-ui。
访问 http://localhost:8080/swagger-ui.html 时出现错误弹出窗口:
"Unable to infer base 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
所以我的问题是:如何指定 jackson 消息转换器的优先级以使 swagger-ui 工作?
我只是在 re-reading 我自己的问题时偶然发现了解决方案。
只需将其添加到上面的 JacksonConfig class(不知道排序是否重要,但它有效)。
@Bean
public MappingJackson2HttpMessageConverter jsonConverter() {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
jsonConverter.setObjectMapper(objectMapper);
return jsonConverter;
}
在 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(); }
}
希望对您有所帮助
我正在开发一个 spring 启动应用程序,它应该启用 swagger-ui。 访问 http://localhost:8080/swagger-ui.html 时出现错误弹出窗口: "Unable to infer base 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
所以我的问题是:如何指定 jackson 消息转换器的优先级以使 swagger-ui 工作?
我只是在 re-reading 我自己的问题时偶然发现了解决方案。
只需将其添加到上面的 JacksonConfig class(不知道排序是否重要,但它有效)。
@Bean
public MappingJackson2HttpMessageConverter jsonConverter() {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
jsonConverter.setObjectMapper(objectMapper);
return jsonConverter;
}
在 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(); }
}
希望对您有所帮助