I want to implement a client for a WebService. I used IntelliJ tools to create classes from wsdl and I prepared all classes as needed to call method from the WebService interface. The problem is that every time I try to call the WebService method I receive this error:
javax.xml.ws.WebServiceException: close method has already been invoked
at com.sun.xml.ws.client.Stub.process(Stub.java:316)
at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:161)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:113)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:93)
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:144)
at com.sun.proxy.$Proxy163.test(Unknown Source)
at com.webapp.svc.ws.client.omscentraldatasending.OmsCentralDataSendingWsClient.test(OmsCentralDataSendingWsClient.java:58)
I have a mock running on SoapUI, I sent a request from SoapUI and it's working.
Testing the WebService starts by pressing a button in a web page. This is how I initialize my beans in the context:
<bean id="omsCentralDataSendingSvc" class="com.bean.omscentraldatasending.OmsCentralDataSendingSvc">
<constructor-arg value="classpath:/META-INF/wsdl/omscentraldatasending/OmsCentralDataSendingSvc.wsdl"/>
</bean>
<bean id="omsCentralDataSendingTest" class="com.webapp.web.adm.omscentraldatasendingtest.OmsCentralDataSendingTest" scope="request">
<property name="omsCentralDataSendingClient">
<bean class="com.webapp.svc.ws.client.omscentraldatasending.OmsCentralDataSendingWsClient" init-method="init">
<property name="webServicePort">
<bean factory-bean="omsCentralDataSendingSvc" factory-method="getOmsCentralDataSendingEndpoint" />
</property>
<property name="endpointAddress" value="http://localhost:9520/OmsCentralDataSendingSvc/"/>
</bean>
</property>
</bean>
I realised that com.sun.xml.ws.client.Stub#close
method is called at some point, which is why the error occurs later, but I don't know why the close
method is being called.
If you need any additional info please let me know.
Apparently the problem was in initializing beans. I moved the nested bean and made it a top level and it's working now.
<bean id="omsCentralDataSendingSvc" class="com.bean.omscentraldatasending.OmsCentralDataSendingSvc">
<constructor-arg value="classpath:/META-INF/wsdl/omscentraldatasending/OmsCentralDataSendingSvc.wsdl"/>
</bean>
<bean id="newBean" class="com.webapp.svc.ws.client.omscentraldatasending.OmsCentralDataSendingWsClient" init-method="init">
<property name="webServicePort">
<bean factory-bean="omsCentralDataSendingSvc" factory-method="getOmsCentralDataSendingEndpoint" />
</property>
<property name="endpointAddress" value="http://localhost:9520/OmsCentralDataSendingSvc/"/>
</bean>
<bean id="omsCentralDataSendingTest" class="com.webapp.web.adm.omscentraldatasendingtest.OmsCentralDataSendingTest" scope="request">
<property name="omsCentralDataSendingClient" ref="newBean">
</bean>