首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >org.springframework.web.reactive.function.UnsupportedMediaTypeException:内容类型'text/xml;charset=UTF-8‘不支持bodyType

org.springframework.web.reactive.function.UnsupportedMediaTypeException:内容类型'text/xml;charset=UTF-8‘不支持bodyType
EN

Stack Overflow用户
提问于 2019-07-15 04:29:49
回答 5查看 26.3K关注 0票数 13

使用Java 11、SpringBoot 2、WebFlux、WebClient和Jackson

尝试使用来使用返回XML的Web服务端点,内容类型:'text/xml;charset=UTF-8‘

项目的pom.xml中的Jackson依赖项:

代码语言:javascript
复制
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.9</version>
</dependency>

触发对外部API的请求并构建响应的WebClient代码:

代码语言:javascript
复制
        WebClient.builder()
                .baseUrl(url)
                .build()
                .get()
                .uri(builder.toUriString(), 1L)
                .accept(TEXT_XML)
                .header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_XML_VALUE)
                .acceptCharset(Charset.forName("UTF-8"))
                .exchange()
                .flatMap(x -> x.bodyToMono(ServiceResponse.class))
                .flatMap(x -> buildResponse(x));

ServiceResponse类(一个简单的POJO):

代码语言:javascript
复制
public class ServiceResponse {

    private String ack;
    private String version;
    private String timestamp;
// .. getters and setters

由此产生的错误:

org.springframework.web.reactive.function.UnsupportedMediaTypeException:内容类型的文本/xml;charset=UTF-8‘不支持bodyType=com.sample.service.model.ServiceResponse at org.springframework.web.reactive.function.BodyExtractors.lambda$readWithMessageReaders$12(BodyExtractors.java:201) ~spring-webflux-5.1.8.RELEASE.jar:5.1.8.RELEASE at java.base/java.util.Optional.orElseGet(Optional.java:369) ~na:na在org.springframework.web.reactive.function.BodyExtractors.readWithMessageReaders(BodyExtractors.java:197) ~spring-webflux 5.1.8.RELEASE.jar:5.1.8.在org.springframework.web.reactive.function.BodyExtractors.lambda$toMono$2(BodyExtractors.java:85) ~spring-webflux-5.1.8.RELEASE.jar:5.1.8.RELEASE at org.springframework.web.reactive.function.client.DefaultClientResponse.body(DefaultClientResponse.java:95) ~spring-webflux-5.1.8.RELEASE.jar:5.1.8.RELEASE at org.springframework.web.reactive.function.client.DefaultClientResponse.bodyToMono(DefaultClientResponse.java:113) ~spring-webflux-5.1.8.RELEASE.jar:5.1.8.RELEASE

如何正确使用响应类型:内容类型'text/xml;charset=UTF-8'?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-07-15 07:30:39

Spring目前不支持Jackson参见专刊。同时,您可以在Jaxb2XmlEncoderJaxb2XmlDecoder中使用Jaxb。

票数 5
EN

Stack Overflow用户

发布于 2021-02-09 01:48:47

在我的例子中,问题在于我忘记设置Accept头,服务器的默认行为是返回XML。

将其设置为MediaType.APPLICATION_JSON解决了问题,服务器开始返回JSON。

票数 1
EN

Stack Overflow用户

发布于 2020-07-16 10:11:17

添加

代码语言:javascript
复制
.accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML) 

为我工作过。MediaType表示在HTTP规范中定义的因特网媒体类型。用于参考:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/MediaType.html

当我在春季网络流量中尝试使用WebTestClient编写tc时,我遇到了这个错误。单元测试如下所示:

代码语言:javascript
复制
@Test
 public void testGetJobSummariesResBody() throws Exception{
 List<JobSummary> responseBody =
                testClient
                .get().uri("<uri-name>")
                .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
                .header(APPNAME_HEADER, "<header-name>")
                .exchange()
                .expectStatus().isOk()
                .expectBodyList(JobSummary.class)
                .returnResult()
                .getResponseBody();

        assertNotNull(responseBody.get(0).getJobType());
        assertNotEquals(0,responseBody.size());
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57033268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档