Почему вызов REST с полезной нагрузкой xml, заключенной в "DeferredDocumentImpl" (пружинный рестемплат) - PullRequest
0 голосов
/ 15 апреля 2020

Я делаю вызов покоя, используя restemplate, и полезная нагрузка составляет XML. (мы имеем дело с устаревшими серверами) Но когда я отлаживаю XML на сервере, который является весенним приложением (устаревшее, но здесь неактуальное), я вижу, что полезная нагрузка xml заключена в "DeferredDocumentImpl"

Код клиента: Это новая часть, которая добавляется и является простой (поэтому проблема может быть здесь). Также я тестирую, подделывая xml полезную нагрузку jsut для проверки синтаксического анализа:

   .....
String xmlString ="<?xml version=\"1.0\" ?>\n"
                + "<myroot>\n"
                //node values
                + "</myroot>";

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new InputSource(new StringReader(xml);
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.TEXT_XML);
            HttpEntity<Document> request = new HttpEntity<>(document, headers);




            final ResponseEntity<String> response = restTemplate.postForEntity(uri, request, String.class);

когда я отлаживаю исходящий вызов, я вижу xml полезную нагрузку, заключенную в «DeferredDocumentImpl»

    22:17:02.879 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "POST /myuri HTTP/1.1[\r][\n]"
    22:17:02.879 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "Accept: text/plain, application/xml, text/xml, application/json, application/*+xml, application/*+json, */*[\r][\n]"
    22:17:02.879 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "X-Forwarded-For: value[\r][\n]"
    22:17:02.879 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "Content-Type: text/xml[\r][\n]"
    22:17:02.879 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "Content-Length: 277[\r][\n]"
    22:17:02.879 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "Host: localdev.stanfordhealthcare.org:8443[\r][\n]"
    22:17:02.879 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "Connection: Keep-Alive[\r][\n]"
    22:17:02.879 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "User-Agent: Apache-HttpClient/4.5.11 (Java/12.0.2)[\r][\n]"
    22:17:02.879 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "Accept-Encoding: gzip,deflate[\r][\n]"
    22:17:02.879 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "[\r][\n]"
    22:17:02.879 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "<DeferredDocumentImpl>&lt;?xml version="1.0" encoding="UTF-16"?>&lt;myroot>[\n]"
    22:17:02.879 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "   &lt;notification>[\n]"
    22:17:02.879 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "      &lt;type>3&lt;/type>[\n]"
/////
    22:17:02.879 [main] DEBUG org.apache.http.wire - http-outgoing-0 >> "&lt;/myroot></DeferredDocumentImpl>"
    22:17:08.324 [poolScheduler1] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Closing expired connections

Код сервера: Это рабочий производственный устаревший код, который обрабатывает xml полезная нагрузка должным образом. Так что я не думаю, что здесь есть проблема, поскольку он обрабатывает такую ​​же xml полезную нагрузку от других клиентов.

 @SuppressWarnings("unchecked")
public static <T> T parseRequestObject(Class<T> pojoClass, HttpServletRequest request) {
    T pojoObject = null;


        String xml = IOUtils.toString(request.getReader());
        ...
}

Так что здесь, когда я отлаживаю xml, я вижу xml полезную нагрузку, заключенную в " DeferredDocumentImpl "

"<DeferredDocumentImpl>&lt;?xml version="1.0" encoding="UTF-16"?>&lt;myroot> <..></DeferredDocumentImpl>"

В: Я не уверен, откуда этот« DeferredDocumentImpl »и почему, и как это исправить.

1 Ответ

0 голосов
/ 15 апреля 2020

Я решил это, и ошибка в из-за устаревшей обработки полезной нагрузки). Это вызов REST, но приемлемым содержимым является простой текст (как xml), а не как XML документ!

HttpHeaders headers = new HttpHeaders();
   headers.add("X-Forwarded-For", "value");
   headers.setContentType(MediaType.TEXT_XML);
   headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));//This is by default
   HttpEntity<String> request = new HttpEntity<String>(xmlString, headers);
...