问题描述
我正在调用一个API,该API返回内容类型为“ text / html”的xml响应 当我尝试解析xml类中的响应时,收到错误消息:
Content type 'text/html' not supported for bodyType=Response
API的实际响应
<?xml version='1.0' encoding='UTF-8'?>
<response version="1.0">
<responseCode>200</responseCode>
<responseMsg>some message</responseMsg>
</response>
我添加了自定义编解码器以解决此问题,但不知何故。当我补充说我得到json解码错误:
JSON decoding error: Unexpected character ('<' (code 60)): expected a valid value (number,String,array,object,'true','false' or 'null')
return webClient.get()
.uri { builder ->
builder.path("/apiPath")
.queryParams(queryParams)
.build()
}
.retrieve()
.onStatus({ it != HttpStatus.OK }) {
RuntimeException("").toMono()
}
.bodyToMono(Response::class.java)
.doOnError {
logger.error { "Error" }
}.block()
网络客户端构建器
@Bean
fun webClient(): WebClient = WebClient.builder()
.exchangeStrategies(ExchangeStrategies.builder().codecs(this::acceptedCodecs).build())
.baseUrl("apiUrl")
.build()
private fun acceptedCodecs(clientCodecConfigurer: ClientCodecConfigurer) {
clientCodecConfigurer.customCodecs().register(Jackson2JsonEncoder(ObjectMapper(),TEXT_HTML))
clientCodecConfigurer.customCodecs().register(Jackson2JsonEncoder(ObjectMapper(),TEXT_HTML))
}
响应类别
@XmlAccessorType(XmlAccesstype.FIELD)
@XmlRootElement(name = "response")
data class Response(
@XmlElement
val responseCode: String = "2000",@XmlElement
val responseMsg: String = "OK",)
我认为添加自定义编解码器部件需要进行修改,但是我没有得到确切的更改。 请让我知道我在哪里做错了。谢谢。
编辑: 我试图像这样修改XML的exchangeStrategies
clientCodecConfigurer.defaultCodecs().jaxb2Decoder(Jaxb2XmlDecoder())
clientCodecConfigurer.defaultCodecs().jaxb2Encoder(Jaxb2XmlEncoder())
但有相同的错误
message : Content type 'text/html' not supported for bodyType=Response
解决方法
Jaxb2XmlDecoder默认构造函数默认没有“ text / html”。您需要将其传递给使用Jaxb2XmlDecoder(MimeType ... supportedMimeTypes) 例如:
clientCodecConfigurer.defaultCodecs().jaxb2Decoder(
Jaxb2XmlDecoder(MimeTypeUtils.APPLICATION_XML,MimeTypeUtils.TEXT_XML,MediaType("application","*+xml"),MimeTypeUtils.TEXT_HTML))