使用Java 11、SpringBoot 2、WebFlux、WebClient和Jackson
尝试使用来使用返回XML的Web服务端点,内容类型:'text/xml;charset=UTF-8‘
项目的pom.xml中的Jackson依赖项:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.9</version>
</dependency>触发对外部API的请求并构建响应的WebClient代码:
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):
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'?
发布于 2019-07-15 07:30:39
Spring目前不支持Jackson参见专刊。同时,您可以在Jaxb2XmlEncoder和Jaxb2XmlDecoder中使用Jaxb。
发布于 2021-02-09 01:48:47
在我的例子中,问题在于我忘记设置Accept头,服务器的默认行为是返回XML。
将其设置为MediaType.APPLICATION_JSON解决了问题,服务器开始返回JSON。
发布于 2020-07-16 10:11:17
添加
.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时,我遇到了这个错误。单元测试如下所示:
@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());
}https://stackoverflow.com/questions/57033268
复制相似问题