web-dev-qa-db-ja.com

java.lang.ClassCastException:javax.xml.bind.JAXBElementをにキャストできません

SpringBootを使用してWebサービスを呼び出しています。

私の設定クラスは次のとおりです。

@Configuration
public class ClientAppConfig {
@Bean
public Jaxb2Marshaller marshaller() {
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setPackagesToScan("com.client.stub");
    return marshaller;
}

@Bean
public ARTestClient arTestClient(Jaxb2Marshaller marshaller) {
    ARTestClient client = new ARTestClient();
    client.setDefaultUri("uri");
    client.setMarshaller(marshaller);
    client.setUnmarshaller(marshaller);
   return client;
}

私は次のようにサービスを呼び出しています:

    OutputMessageType response = (OutputMessageType) getWebServiceTemplate().marshalSendAndReceive(
            inputMessageType, new SoapActionCallback("http://Serviceuri"));

次のエラーが発生します:

   [2016-03-18 14:45:43.697] boot - 10272 ERROR [http-nio-8080-exec-1] --- [dispatcherServlet]: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception 
  [Request processing failed; nested exception is Java.lang.ClassCastException: javax.xml.bind.JAXBElement 
  cannot be cast to com.wfs.client.stub.ar.OutputMessageType] with root cause

Webサービスからの出力をアンマーシャリングする方法?????応答にアンマーシャラーを設定するにはどうすればよいですか?

10
user5636236

おかしい私はちょうど同じ問題を抱えていました、これが私がしたことです:

にあなたの応答をキャストします

JAXBElement<OutputMessageType>

したがって、結果は次のようになります

JAXBElement<OutputMessageType> response = (JAXBElement<OutputMessageType>) getWebServiceTemplate().marshalSendAndReceive(
        inputMessageType, new SoapActionCallback("http://Serviceuri"));
// Then just call
System.out.println(response.getValue());

私はあなたとほぼ同じ構成を持っています。私はまだClassCastExceptionがある理由を理解しようとしています。少なくとも回避策があります...

20
Philippe

それが今日でも関連している場合は、構成ファイルでこの問題を解決する方法があります。次の行で。setPackagesToScanを使用する代わりに:marshaller.setPackagesToScan("com.client.stub")
使用を検討してください。setClassesToBeBound
ただし、パッケージの下にある各クラス(マーシャリングとアンマーシャリングに使用される)を参照する必要があります。

   marshaller.setClassesToBeBound(new Class[] { 
       com.client.stub.Foo.class,
       com.client.stub.Bar.class,
       com.client.stub.Baz.class
   });

JAXBElementにキャストする必要はありません。

6
fabricemarcelin
    JAXBElement<OutputMessageType> response = (JAXBElement<OutputMessageType>) 
    getWebServiceTemplate().marshalSendAndReceive(
    inputMessageType, new SoapActionCallback("http://Serviceuri"));
    // Then just call 
     System.out.println(response.getValue());

私の場合はうまくいきました

1
user5636236