2 Replies Latest reply on Jul 6, 2007 1:09 AM by Thomas Barry

    Accessing Seam Web Service

    Thomas Barry Newbie

      Has anyone had success writing a client for a Seam web service? I've got a skeleton modeled after the seambay example:

      @Remote
      public interface AgentRemote {
      
       public void processOrder();
      
      }


      @Stateless
      @WebService(name="AgentService", serviceName="AgentService")
      public class Agent implements AgentRemote {
      
       @WebMethod
       public void processOrder() {
       System.out.println("METHOD CALLED");
       }
      
      }


      When deployed, I can get the following WSDL from the service:

      <definitions name='AgentService' targetNamespace='http://service.web.tcsc.twocoast.com/' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://service.web.tcsc.twocoast.com/' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
       <types>
       <xs:schema targetNamespace='http://service.web.tcsc.twocoast.com/' version='1.0' xmlns:tns='http://service.web.tcsc.twocoast.com/' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
       <xs:element name='processOrder' type='tns:processOrder'/>
       <xs:element name='processOrderResponse' type='tns:processOrderResponse'/>
       <xs:complexType name='processOrder'/>
       <xs:complexType name='processOrderResponse'/>
       </xs:schema>
       </types>
       <message name='AgentService_processOrder'>
       <part element='tns:processOrder' name='processOrder'></part>
       </message>
       <message name='AgentService_processOrderResponse'>
       <part element='tns:processOrderResponse' name='processOrderResponse'></part>
       </message>
       <portType name='AgentService'>
       <operation name='processOrder' parameterOrder='processOrder'>
       <input message='tns:AgentService_processOrder'></input>
       <output message='tns:AgentService_processOrderResponse'></output>
       </operation>
       </portType>
       <binding name='AgentServiceBinding' type='tns:AgentService'>
       <soap:binding style='document' transport='http://schemas.xmlsoap.org/soap/http'/>
       <operation name='processOrder'>
       <soap:operation soapAction=''/>
       <input>
       <soap:body use='literal'/>
       </input>
       <output>
       <soap:body use='literal'/>
       </output>
       </operation>
       </binding>
       <service name='AgentService'>
       <port binding='tns:AgentServiceBinding' name='AgentServicePort'>
       <soap:address location='http://127.0.0.1:8080/AgentService/Agent'/>
       </port>
       </service>
      </definitions>


      I've tried writing simple clients in both Axis and Axis2. Here's the Axis2 version:

      import org.apache.axiom.om.OMAbstractFactory;
      import org.apache.axiom.om.OMElement;
      import org.apache.axiom.om.OMFactory;
      import org.apache.axiom.om.OMNamespace;
      import org.apache.axis2.AxisFault;
      import org.apache.axis2.addressing.EndpointReference;
      import org.apache.axis2.client.Options;
      import org.apache.axis2.client.ServiceClient;
      
      public class Client {
       public static void main(String[] args) throws Exception {
      
       try {
      
       String endpoint="http://127.0.0.1:8080/AgentService/Agent";
       EndpointReference targetEPR = new EndpointReference(endpoint);
      
       OMFactory fac = OMAbstractFactory.getOMFactory();
       OMNamespace omNs = fac.createOMNamespace("http://twocoast.com/service", "tcsc");
       OMElement payload = fac.createOMElement("processOrder", omNs);
       Options options = new Options();
       options.setTo(targetEPR);
       //options.setAction("tcsc:processOrder");
      
       ServiceClient sender = new ServiceClient();
       sender.setOptions(options);
       OMElement result = sender.sendReceive(payload);
       sender.fireAndForget(result);
       } catch (AxisFault axisFault) {
       axisFault.printStackTrace();
       }
      
       }
      }


      Regardless of the client, I get the following error in response to a request:

      org.apache.axis2.AxisFault: Endpoint {http://service.web.tcsc.twocoast.com/}AgentServicePort does not contain operation meta data for: {http://twocoast.com/service}processOrder
       at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:434)
       at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:373)
       at org.apache.axis2.description.OutInAxisOperationClient.execute(OutInAxisOperation.java:294)
       at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:520)
       at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:500)
       at Client.main(Client.java:27)


      I've seen this error referenced in the JBoss WS forums, but haven't found a definitive answer. Has anyone had more luck with this than I have? BTW, I'm deploying to JBoss AS 4.2.0.GA and using Seam 2.0.0.BETA1


        • 1. Re: Accessing Seam Web Service
          Shane Bryzak Master

          I'm 99% certain this is a JBossWS issue. Seam/WS doesn't really do anything that "interferes" with the normal operation of web services. I recommend you ask on the JBossWS forum and keep bugging them if they're slow to answer.

          • 2. Re: Accessing Seam Web Service
            Thomas Barry Newbie

            Turns out it was my issue- it's important that the namespace matches what's in the WSDL:

            public class Client {
             public static void main(String[] args) throws Exception {
            
             try {
             OMFactory fac = OMAbstractFactory.getOMFactory();
             OMNamespace omNs = fac.createOMNamespace("http://service.web.tcsc.twocoast.com/", "tns");
             OMElement method = fac.createOMElement("processOrder", omNs);
            
             Options options = new Options();
             options.setTo(new EndpointReference("http://localhost:8080/AgentService/Agent"));
             options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
             options.setAction("urn:processOrder");
             ServiceClient sender = new ServiceClient();
             sender.setOptions(options);
             sender.sendReceive(method);
             } catch (AxisFault axisFault) {
             System.out.println("GOT FAULT");
             axisFault.printStackTrace();
             }
            
             }
            }