在春季启动中使用网络客户端解析对xml的text / html响应

问题描述

我正在调用一个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')

这是我的代码: 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()

网络客户端构建器

    @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))