当我试图在xml类中解析响应时,我正在调用一个API,它用内容类型"text/html“返回xml响应,得到的是错误消息:
Content type 'text/html' not supported for bodyType=ResponseAPI的实际响应
<?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')下面是我的代码: API调用
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()web客户端构建器
@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发布于 2020-10-30 01:00:08
默认情况下,Jaxb2XmlDecoder默认构造函数没有"text/html“。你需要把它传递给使用Jaxb2XmlDecoder(MimeType.( supportedMimeTypes)例如:
clientCodecConfigurer.defaultCodecs().jaxb2Decoder(
Jaxb2XmlDecoder(MimeTypeUtils.APPLICATION_XML, MimeTypeUtils.TEXT_XML, MediaType("application", "*+xml"), MimeTypeUtils.TEXT_HTML))https://stackoverflow.com/questions/64587787
复制相似问题