Разберите ответ REST без использования аннотации @XMLRootElement - PullRequest
2 голосов
/ 16 марта 2012

Хорошо, я везде искал ответ на этот вопрос.Это сводит меня с ума.

Все, что мне нужно сделать, это отменить очень простой ответ веб-службы.Единственная проблема в том, что я использую сгенерированный исходный файл без аннотации @XmlRootElement.Я не могу редактировать этот сгенерированный исходный файл, чтобы добавить @XmlRootElement, либо.Мне нужно использовать его «как есть».

Это текущий код, который у меня есть, но он приводит к ошибке, показанной внизу этого поста.Я пытался использовать JAXBElement обертку, но безрезультатно.Может ли кто-нибудь дать мне код, который мне нужен?Я понятия не имею, как использовать "QName"s и т. Д.

Этот код ниже прекрасно работает с классами, которые имеют @XmlRootElement:

 MyGeneratedClass response = restTemplate.getForObject("url to webservice!"),
     MyGeneratedClass.class);

 return response

К сожалению, в этом случае выдает эту ошибку,Пожалуйста, помогите мне разобрать ответ REST! ​​

 Could not extract response: no suitable HttpMessageConverter found for response
    type [MyGeneratedClass] and content type [application/xml;version=1]

Ответы [ 3 ]

3 голосов
/ 12 октября 2012

Я забыл о публикации этого много месяцев назад, и я, вероятно, должен найти решение. Это решение также добавляет cookie в заголовки запроса, но вы можете игнорировать это. В случае, если сгенерированный исходный файл не имеет аннотации @XmlRootElement, вы можете отменить сортировку следующим образом:

// Cookie setting
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("Cookie", "myCookie=value");
HttpEntity<?> requestEntity = new HttpEntity(requestHeaders);

HttpEntity<String> response = restTemplate.exchange("web service url"), 
    HttpMethod.GET, requestEntity, String.class);

// Unmarshalling
JAXBElement<MyGeneratedClass> result = 
    (JAXBElement<MyGeneratedClass>) unmarshaller.unmarshal(
        new StreamSource(new ByteArrayInputStream(response.getBody().getBytes())));

return result.getValue();
1 голос
/ 07 октября 2013

RestTemplate Spring обычно используется вместе с org.springframework.oxm.jaxb.Jaxb2Marshaller.К сожалению, в этом классе для свойства supportJaxbElementClass установлено значение по умолчанию: (

Spring нигде не документирует это свойство, и многочисленные вопросы о RestTemplate / JAXBELement на форумах Spring остались без ответа: ((((

К счастью, вы можете настроить Jaxb2Marshaller, установив для его свойства supportJaxbElementClass значение true!

В следующем примере конфигурации RestTemplate будут правильно маршалировать и демаршаллировать объекты типа JAXBElement

<beans>
  <bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <constructor-arg>
      <bean class="org.apache.http.impl.conn.PoolingClientConnectionManager" />
    </constructor-arg>
  </bean>

  <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <constructor-arg>
      <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
        <constructor-arg ref="httpClient" />
      </bean>
    </constructor-arg>
    <!-- Configure the Rest template to translate between XML and JAXB -->
    <property name="messageConverters">
      <list>
        <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
          <property name="marshaller" ref="jaxbMarshaller" />
          <property name="unmarshaller" ref="jaxbMarshaller" />
        </bean>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>        
      </list>
    </property>
  </bean>
  <bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="supportJaxbElementClass" value = "true"/>
    <property name="packagesToScan">
      <list>
        <value>com.myorg.path.to.JAXB.classes</value>
      </list>
    </property>
  </bean>
</beans>
1 голос
/ 31 июля 2012

RestTemplate Spring использует HttpMessageConverter для демонтажа объекта в XML. В частности, метод Jaxb2RootElementHttpMessageConverter.canWrite отвечает за ошибку, которую вы видите. Даже если бы вам пришлось переопределить метод canWrite, чтобы не заботиться о наличии аннотации XmlRootElement, JAXB не сможет разархивировать объект.

Одним из способов обойти это ограничение является переопределение Jaxb2RootElementHttpMessageConverter.canWrite, чтобы не проверять наличие аннотации XmlRootElement И использовать реализацию EclipseLink Moxy JAXB с файлом отображения. В файле отображения вы можете указать эквивалент аннотации XmlRootElement, что позволит вам использовать JAXB без использования аннотаций в вашем классе Java.

...