web-dev-qa-db-ja.com

org.springFramework.Web.Reactive.Function.UnSupportedMediatePeexception:コンテンツタイプ 'text / xml; charset = UTF-8'はBODEYTYPEではサポートされていません

使用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'

4
guilhebl

Jackson XMLはSpring Frameworkによって現時点ではサポートされていません 専用の問題 。その間に、Jaxb2XmlEncoderJaxb2XmlDecoderでJAXBを使用できます。

1
Brian Clozel

追加

.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());
    }
 _
1
Boney