2016-04-14 20 views
1

Ich muss Anfrage senden, um Antwort als ein Jaxb-Objekt zu bedienen und zu analysieren. Das ist Service-Aufruf Code:RestTemplate. Unmarshalling JaxB-Objekt von Oktettstream

 ProviderResponse response = restTemplate.postForObject(
      URL, 
      request, 
      ProviderResponse.class 
     ); 

request und response sind JAXB Objekte. Dies ist Federkonfiguration:

<mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> 
     <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> 
      <property name="marshaller" ref="jaxbMarshaller"/> 
      <property name="unmarshaller" ref="jaxbMarshaller"/> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 


<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <property name="classesToBeBound"> 
     <list> 
      <value>com.service.data.ProviderRequest</value> 
      <value>com.service.data.ProviderResponse</value> 
     </list> 
    </property> 
</bean> 

Wenn ich diesen Code ausführen, erhalte ich eine Ausnahme:

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.service.data.ProviderResponse] and content type [application/octet-stream] 

Ich habe versucht, auf diese Weise zu tun:

 String responseStr = restTemplate.postForObject(
      URL, 
      request, 
      String.class 
     ); 

     ProviderResponse response = stringToJaxb(responseStr, ProviderResponse.class); 

und es funktioniert gut, aber Ich denke nicht, dass es eine gute Lösung ist. Vielleicht kann es durch Federkonfiguration behoben werden?

UPD

ProviderResponse Klasse:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "header", 
    "body" 
}) 
@XmlRootElement(name = "providerResponse") 
public class ProviderResponse { 

    @XmlElement(required = true) 
    protected String header; 
    @XmlElement(required = true) 
    protected ProviderResponse.Body body; 


    public String getHeader() { 
     return header; 
    } 


    public void setHeader(String value) { 
     this.header = value; 
    } 


    public ProviderResponse.Body getBody() { 
     return body; 
    } 


    public void setBody(ProviderResponse.Body value) { 
     this.body = value; 
    } 


    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { 
     "code", 
     "serviceStatus" 
    }) 
    public static class Body { 

     @XmlElement(required = true) 
     protected String code; 
     protected String serviceStatus; 


     public String getCode() { 
      return code; 
     } 

     public void setCode(String value) { 
      this.code = value; 
     } 

     public String getServiceStatus() { 
      return serviceStatus; 
     } 


     public void setServiceStatus(String value) { 
      this.serviceStatus = value; 
     } 

    } 

} 

Antwort

1

Stellen Sie die unterstützten Medientypen auf der MarshallingHttpMessageConverter als

<mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> 
     <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> 
      <property name="marshaller" ref="jaxbMarshaller"/> 
      <property name="unmarshaller" ref="jaxbMarshaller"/> 
      <property name="supportedMediaTypes"> 
       <list> 
        <value>application/xml</value> 
        <value>text/xml</value> 
        <value>application/octet-stream</value> 
       </list> 
      </property> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 
+0

Es funktioniert nicht. Wenn ich 'restTemplate.getMessageConverters()' bekomme, gibt es keinen 'MarshallingHttpMessageConverter'. Es gibt 'Jaxb2RootElementHttpConverter', aber es hat keinen'Octet-Stream' in der Liste der unterstützten Medientypen. – Kirill

+0

Für RestTemplate werden die im Anwendungskontext konfigurierten Konverter nicht verwendet. Sie müssen eine Liste von HttpMessageConverters erstellen und im RestTemplate-Konstruktor wie folgt bereitstellen: MarshallingHttpMessageConverter-Konverter = new MarshallingHttpMessageConverter(); converter.setMarshaller (...); converter.setSupportedMediaTypes (Arrays.asList (MediaType.APPLICATION_OCTET_STREAM)); –

1

Für RestTemplate folgt tut es die Konverter im Anwendungskontext konfiguriert verwenden. Sie müssen eine Liste von HttpMessageConverters erstellen und diese wie folgt im RestTemplate-Konstruktor bereitstellen:

+0

Kann ich es in der Frühlingskonfiguration tun? – Kirill

+0

Es funktioniert immer noch nicht. 'messageConverter.canRead (this.responseClass, contentType)' in 'HttpMessageConverterExtractor.extractData (...)' gibt 'false' für' ProviderResponse' und 'application/octet-stream' zurück – Kirill

+0

Veröffentlichen Sie Ihre ProviderResponse-Klasse –