4

次のような Web サービス MyWebServiceImpl を実装しました。

@WebServiceClient(//my parameters//)
@HandlerChain(file = "handlers.xml")
public class MyWebServiceImpl {...}

また、私は MyWebService のようなインターフェースを持っています

@WebService(//my parameters//)
@XmlSeeAlso({
com.my.ObjectFactory.class,
com.my.second.ObjectFactory.class,
com.my.third.ObjectFactory.class
})
public interface MyWebService {...}

SOAPハンドラーでレスポンスを取得したいので、handlers.xml、LoggingHandlerを作成しました。次に、テストクラスを実行しようとすると、エラーが発生します:

javax.xml.ws.WebServiceException: {http://service.ws.my.com/}MyWebServiceImpl is not a valid service. Valid services are: {http://service.ws.my.com/}myWebService
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:223)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:168)
at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:96)
at javax.xml.ws.Service.<init>(Service.java:77)
at com.my.ws.service.MyWebServiceImpl.<init>(MyWebServiceImpl.java:46)
at test.MainTest.<init>(MainTest.java:354)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:187)
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:236)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:233)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
4

1 に答える 1

14

serviceName入力のパラメータが WSDL で指定されたサービスの名前と一致super(...)MyWebServiceImplないようです。WSDL ファイルを確認すると、次のフラグメントが見つかるはずです。

<wsdl:service name="myWebService">

serviceName パラメータを正しいもの (つまりmyWebService) に置き換えます。

wsimportクライアント スタブ全体を手動で実装するのではなく、ツールを使用することをお勧めします。コマンドラインから、Ant タスクおよび Maven プラグインとして使用できます。WSDL ファイルまたは URL を指定するだけです。これにより、面倒な作業を回避できます。標準の Oracle マニュアルなど、多くのドキュメントがあります。

もちろん、生成された @WebServiceClient には @HandlerChain アノテーションはありません。ただし、追加のハンドラーは実行時に簡単に追加できます。たとえば、次のようになります。

MyWebServiceImplService service = new MyWebServiceImplService();
MyWebService myWebService = service.getMyWebServiceImplPort();
List<Handler> handlerChain = new ArrayList<Handler>();
handlerChain.add(new LoggingHandler());
((BindingProvider) myWebService).getBinding().setHandlerChain(
        handlerChain);

System.out.println(myWebService.hello("world"));
于 2013-10-18T20:47:32.090 に答える