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サービスからの出力をアンマーシャリングする方法?????応答にアンマーシャラーを設定するにはどうすればよいですか?
おかしい私はちょうど同じ問題を抱えていました、これが私がしたことです:
にあなたの応答をキャストします
JAXBElement<OutputMessageType>
したがって、結果は次のようになります
JAXBElement<OutputMessageType> response = (JAXBElement<OutputMessageType>) getWebServiceTemplate().marshalSendAndReceive(
inputMessageType, new SoapActionCallback("http://Serviceuri"));
// Then just call
System.out.println(response.getValue());
私はあなたとほぼ同じ構成を持っています。私はまだClassCastExceptionがある理由を理解しようとしています。少なくとも回避策があります...
それが今日でも関連している場合は、構成ファイルでこの問題を解決する方法があります。次の行で。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にキャストする必要はありません。
JAXBElement<OutputMessageType> response = (JAXBElement<OutputMessageType>)
getWebServiceTemplate().marshalSendAndReceive(
inputMessageType, new SoapActionCallback("http://Serviceuri"));
// Then just call
System.out.println(response.getValue());
私の場合はうまくいきました