使用Java 11、SpringBoot 2、Webflux、WebClient、およびJackson)
spring WebClientを使用してXML、コンテンツタイプ: 'text/xml; charset = UTF-8'を返すWebサービスエンドポイントを消費しようとしています。
プロジェクトのPom.xmlのジャクソンXML依存関係:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.9</version>
</dependency>
_
外部APIへの要求をトリガーして応答を構築するWebクライアントコード。
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.UnsupportedMediatePeexception:コンテンツタイプ 'text/XML; charset = UTF-8'はサポートされていません for bodytype = com.sample.service.model.ServiceRespone .web.Reactive.Function.BodyExtractors.Lambda $ ReadWithmesSageReaders $ 12(bodyextractors.java:201)〜[Spring-webflux-5.1.8.release.jar:5.1.8.release] 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] org.springFramework.Web.Reactive.Function.Client.DefaultClientResponse.body(defaultClientResponse.java:95)〜[Spring-Webflux-5.1.8.release.jar:5.1.8.release] org.springFramework.Web。 Reactive.Function.Client.DefaultClientResponse.BodyTomono(defaultClientResponse.j AVA:113)〜[Spring-Webflux-5.1.8.release.jar:5.1.8 .release]
応答の種類を正しく消費する方法:content-type 'text/xml; charset = utf-8'?
Jackson XMLはSpring Frameworkによって現時点ではサポートされていません 専用の問題 。その間に、Jaxb2XmlEncoder
とJaxb2XmlDecoder
でJAXBを使用できます。
追加
.accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
_
私のために働いた。 MediaTypeは、HTTP仕様で定義されているインターネットメディアタイプを表します。は参照用です. https://docs.spring.io/spring/docs /current/javadoc-api/org/springframework/http/mediatype.html *
Spring WebFluxの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());
}
_