जावा 11, स्प्रिंगबूट 2, वेबफ्लक्स, वेबक्लाइंट और जैक्सन का उपयोग करना

एक वेब सेवा समापन बिंदु का उपभोग करने के लिए स्प्रिंग वेब क्लाइंट का उपयोग करने का प्रयास कर रहा है जो एक्सएमएल देता है, सामग्री प्रकार: 'टेक्स्ट/एक्सएमएल; वर्णसेट = यूटीएफ -8'

परियोजना के pom.xml में जैक्सन एक्सएमएल निर्भरता:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.9</version>
</dependency>

वेब क्लाइंट कोड जो बाहरी एपीआई के लिए अनुरोध को ट्रिगर करता है और प्रतिक्रिया बनाता है:

        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: सामग्री प्रकार 'text/xml;charset=UTF-8' समर्थित नहीं है for bodyType=com.sample.service.model.ServiceResponse at org.springframework.web.reactive.function.BodyExtractors.lambda$readWithMessageReaders$12(BodyExtractors.java:201) ~[वसंत-वेबफ्लक्स-5.1.8.रिलीज.जर:5.1.8.रिलीज] पर java.base/java.util.Optional.orElseGet(Optional.java:369) ~[na:na] पर org.springframework.web.reactive.function.BodyExtractors.readWithMessageReaders(BodyExtractors.java:197) ~[वसंत-वेबफ्लक्स-5.1.8.रिलीज.जर:5.1.8.रिलीज] पर org.springframework.web.reactive.function.BodyExtractors.lambda$toMono$2(BodyExtractors.java:85) ~[वसंत-वेबफ्लक्स-5.1.8.रिलीज.जर:5.1.8.रिलीज] पर org.springframework.web.reactive.function.client.DefaultClientResponse.body(DefaultClientResponse.java:95) ~[वसंत-वेबफ्लक्स-5.1.8.रिलीज.जर:5.1.8.रिलीज] पर org.springframework.web.reactive.function.client.DefaultClientResponse.bodyToMono(DefaultClientResponse.java:113) ~[वसंत-वेबफ्लक्स-5.1.8.रिलीज.जर:5.1.8.रिलीज]

प्रतिक्रिया के प्रकार का ठीक से उपभोग कैसे करें: सामग्री-प्रकार 'text/xml;charset=UTF-8' ?

6
guilhebl 15 जुलाई 2019, 07:29

4 जवाब

सबसे बढ़िया उत्तर

जैक्सन एक्सएमएल इस समय स्प्रिंग फ्रेमवर्क द्वारा समर्थित नहीं है - देखें समर्पित मुद्दा ए>। इस बीच, आप Jaxb2XmlEncoder और Jaxb2XmlDecoder के साथ Jaxb का उपयोग कर सकते हैं।

2
Brian Clozel 15 जुलाई 2019, 07:30

असमर्थित मीडिया टाइप अपवाद को भ्रमित करते समय एक और स्थिति फेंक दी जाती है। आइए मान लें कि एपी का उत्पादन कर रहा है जो http/80 और https/443 दोनों को सुनता है। हालांकि इसे कॉन्फ़िगर किया गया है ताकि http पर कोई सामग्री नहीं दी जा सके। इसके बजाय यह सामग्री-प्रकार टेक्स्ट/एचटीएमएल वाले कुछ एचटीएमएल सामग्री के साथ HTTP 301 रीडायरेक्ट संदेश देता है। डिफ़ॉल्ट रूप से WebClient 301 रीडायरेक्ट का पालन नहीं करता है और इसके बजाय यह लौटाए गए HTML संदेश को ग्रहण किए गए वर्ग में पार्स करने का प्रयास करता है। यह स्पष्ट रूप से विफल रहता है और असमर्थित मीडिया टाइप अपवाद अपवाद उत्पन्न करता है। यह इस तथ्य से और भ्रमित हो सकता है कि पोस्टमैन डिफ़ॉल्ट रूप से 301 रीडायरेक्ट का अनुसरण करता है और इसे पूरी तरह से पारदर्शी तरीके से करता है। यह धारणा छोड़ना कि आपको http अनुरोध के माध्यम से अपेक्षित सामग्री मिलती है।

समाधान: https अनुरोध का उपयोग करें।

0
Olavi Vaino 6 अप्रैल 2021, 12:54

मेरे मामले में समस्या यह थी कि मैं Accept हेडर सेट करना भूल गया था और सर्वर का डिफ़ॉल्ट व्यवहार XML को वापस करना था।
इसे MediaType.APPLICATION_JSON पर सेट करने से समस्या हल हो गई और सर्वर ने JSON वापस करना शुरू कर दिया।

0
JohnEye 9 फरवरी 2021, 01:48

मेरे पास एक समान मामला था, जब मैं "सादा/पाठ" वापस करने की कोशिश कर रहा था लेकिन ऑब्जेक्ट को एक जेसन प्रारूप में हल किया जा रहा था (इसलिए वास्तव में एक टेक्स्ट नहीं)। मुझे लगता है कि वसंत प्रतिक्रिया सामग्री-प्रकार और आपके द्वारा सेट किए गए शरीर के कुछ सत्यापन कर रहा था। मेरी वास्तविक प्रतिक्रिया इस प्रकार थी:

Mono.just(quote.getQuote())
                .flatMap(s -> ServerResponse.ok()
                        .contentType(MediaType.TEXT_PLAIN)
                        .syncBody(s)
                );

लेकिन यह भी स्वीकार्य था:

Mono.just(jsonQuote)
                .flatMap(s -> ServerResponse.ok()
                        .contentType(MediaType.APPLICATION_JSON)
                        .syncBody(s)
                );
0
stelios.anastasakis 11 अगस्त 2020, 13:57