axis-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michele Mazzucco <Michele.Mazzu...@ncl.ac.uk>
Subject Re: [Axis2] JAX-WS & working at xml level on the client side
Date Fri, 12 Oct 2007 09:22:35 GMT
Nick.

thanks, but I can't get it working.

Here is the service (it's like SOAP12Provider, but without
dependencies):

package service.jaxws;

import javax.xml.ws.BindingType;
import javax.xml.ws.Provider;
import javax.xml.ws.WebServiceProvider;
import javax.xml.ws.soap.SOAPBinding;

/**
 * A Provider&lt;String&gt; implementation used to test sending and 
 * receiving SOAP 1.2 messages.
 */
@WebServiceProvider()
@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
public class SOAP12Provider implements Provider<String> {

    private static final String sampleResponse = 
        "<test:echoStringResponse xmlns:test=
\"http://org/apache/axis2/jaxws/test/SOAP12\">" +
        "<test:output>SAMPLE REQUEST MESSAGE</test:output>" +
        "</test:echoStringResponse>";
    
    /* 
     * @see javax.xml.ws.Provider#invoke(java.lang.Object)
     */
    public String invoke(String obj) {
        System.out.printf("Received >>> %s\n", obj);
        return sampleResponse;
    }

}


which runs into an embedded axis2 instance:

import java.util.HashMap;
import java.util.Map;


import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.ConfigurationContextFactory;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.transport.http.SimpleHTTPServer;
import org.apache.log4j.BasicConfigurator;

import service.jaxws.SOAP12Provider;

/**
 * <a href="http://wso2.org/library/83">How do I Embed SimpleHTTPServer
in My
 * Application and Deploy a POJO?</a>
 * 
 */
public class EmbeddedAxis2Server {
    
    static {
        BasicConfigurator.configure();
    }

    /**
     * @param args
     */
    public static void main(String[] args) throws AxisFault {
        ConfigurationContext context = ConfigurationContextFactory
                .createConfigurationContextFromFileSystem(null, null);

        Map<String, String> map = new HashMap<String, String>(1);
        map.put("http://www.w3.org/2004/08/wsdl/in-out",
"org.apache.axis2.jaxws.server.JAXWSMessageReceiver");

        AxisService echoJaxWs =
AxisService.createService(SOAP12Provider.class.getName(),
            context.getAxisConfiguration(), map,
"http://org/apache/axis2/jaxws/test/SOAP12",
"http://org/apache/axis2/jaxws/test/SOAP12",
            Thread.currentThread().getContextClassLoader());
        context.getAxisConfiguration().addService(echoJaxWs);

        SimpleHTTPServer server = new SimpleHTTPServer(context, 8080);
        server.start();
    }

}


The client is SOAP12Dispatch + the main method

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import javax.xml.ws.Service.Mode;
import javax.xml.namespace.QName;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import javax.xml.ws.soap.SOAPBinding;
import javax.xml.ws.soap.SOAPFaultException;

import org.apache.log4j.BasicConfigurator;

public class SOAP12Dispatch {

    private static final QName QNAME_SERVICE = new QName(
        "http://org/apache/axis2/jaxws/test/SOAP12", "SOAP12Service");

    private static final QName QNAME_PORT = new QName(
        "http://org/apache/axis2/jaxws/test/SOAP12", "SOAP12Port");

    private static final String URL_ENDPOINT =
"http://localhost:8080/axis2/services/SOAP12Provider";

    private static final String sampleRequest = "<test:echoString
xmlns:test=\"http://org/apache/axis2/jaxws/test/SOAP12\">"
            + "<test:input>SAMPLE REQUEST MESSAGE</test:input>" +
"</test:echoString>";

    private static final String sampleEnvelopeHead = "<soapenv:Envelope
xmlns:soapenv=\"http://www.w3.org/2003/05/soap-envelope\">"
            + "<soapenv:Header /><soapenv:Body>";

    private static final String sampleEnvelopeHead_MustUnderstand =
"<soapenv:Envelope xmlns:soapenv=
\"http://www.w3.org/2003/05/soap-envelope\">"
            + "<soapenv:Header>"
            + "<soapenv:codeHeaderSOAP12 soapenv:mustUnderstand=\"true
\">"
            + "<code>default</code>"
            + "</soapenv:codeHeaderSOAP12>"
            + "</soapenv:Header>" + "<soapenv:Body>";

    private static final String sampleEnvelopeTail =
"</soapenv:Body></soapenv:Envelope>";

    private static final String sampleEnvelope = sampleEnvelopeHead +
sampleRequest
            + sampleEnvelopeTail;

    private static final String sampleEnvelope_MustUnderstand =
sampleEnvelopeHead_MustUnderstand
            + sampleRequest + sampleEnvelopeTail;


    /**
     * Test sending a SOAP 1.2 request in PAYLOAD mode
     */
    public void testSOAP12DispatchPayloadMode() throws Exception {
        // Create the JAX-WS client needed to send the request
        Service service = Service.create(QNAME_SERVICE);
        service.addPort(QNAME_PORT, SOAPBinding.SOAP12HTTP_BINDING,
URL_ENDPOINT);
        Dispatch<Source> dispatch = service.createDispatch(
                QNAME_PORT, Source.class, Mode.PAYLOAD);
        
        // Create the Source object with the payload contents.  Since
        // we're in PAYLOAD mode, we don't have to worry about the
envelope.
        byte[] bytes = sampleRequest.getBytes();
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        StreamSource request = new StreamSource(bais);
        
        // Send the SOAP 1.2 request
        Source response = dispatch.invoke(request);
        
        // Convert the response to a more consumable format
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        StreamResult result = new StreamResult(baos);
        
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer trans = factory.newTransformer();
        trans.transform(response, result);
        
        // Check to make sure the contents are correct.  Again, since
we're
        // in PAYLOAD mode, we shouldn't have anything related to the
envelope
        // in the return, just the contents of the Body.
        String responseText = baos.toString();
        if (responseText.contains("soap")) {
            throw new IllegalStateException("the response contains
'soap'");
        }
        if (responseText.contains("Body")) {
            throw new IllegalStateException("the response contains
'Body'");
        }
        if (responseText.contains("Envelope")) {
            throw new IllegalStateException("the response contains
'Envelope'");
        }
        if (responseText.contains("echoStringResponse")) {
            throw new IllegalStateException("the response contains
'echoStringResponse'");
        }       
    }
    
    /**
     * Test sending a SOAP 1.2 request in MESSAGE mode
     */
    public void testSOAP12DispatchMessageMode() throws Exception {
        // Create the JAX-WS client needed to send the request
        Service service = Service.create(QNAME_SERVICE);
        service.addPort(QNAME_PORT, SOAPBinding.SOAP12HTTP_BINDING,
URL_ENDPOINT);
        Dispatch<Source> dispatch = service.createDispatch(
                QNAME_PORT, Source.class, Mode.MESSAGE);
        
        // Create the Source object with the message contents.  Since
        // we're in MESSAGE mode, we'll need to make sure we create this
        // with the right protocol.
        byte[] bytes = sampleEnvelope.getBytes();
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        StreamSource request = new StreamSource(bais);
        
        Source response = dispatch.invoke(request);
        
        // Convert the response to a more consumable format
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        StreamResult result = new StreamResult(baos);
        
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer trans = factory.newTransformer();
        trans.transform(response, result);
        
        // Check to make sure the contents of the message are correct
        String responseText = baos.toString();
        
        if (! responseText.contains("soap")) {
            throw new IllegalStateException("the response does not
contain 'soap'");
        }
        if (! responseText.contains("Body")) {
            throw new IllegalStateException("the response does not
contain 'Body'");
        }
        if (! responseText.contains("Envelope")) {
            throw new IllegalStateException("the response does not
contain 'Envelope'");
        }
        if (! responseText.contains("echoStringResponse")) {
            throw new IllegalStateException("the response does not
contain 'echoStringResponse'");
        }
        
        // Check to make sure the message returned had the right
protocol version
        // TODO: Need to determine whether or not we should be using the
hard 
        // coded URLs here, or whether we should be using a constant for
the 
        // purposes of the test.
        if (!
responseText.contains("http://www.w3.org/2003/05/soap-envelope")) {
            throw new IllegalStateException("the response does not
contain 'http://www.w3.org/2003/05/soap-envelope'");
        }
        if (!
responseText.contains("http://schemas.xmlsoap.org/soap/envelop")) {
            throw new IllegalStateException("the response does not
contain 'http://schemas.xmlsoap.org/soap/envelop'");
        }
    }
    
    /**
     * Test sending a SOAP 1.2 request in MESSAGE mode
     */
    public void testSOAP12DispatchMessageMode_MustUnderstand() throws
Exception {
        // Create the JAX-WS client needed to send the request
        Service service = Service.create(QNAME_SERVICE);
        service.addPort(QNAME_PORT, SOAPBinding.SOAP12HTTP_BINDING,
URL_ENDPOINT);
        Dispatch<Source> dispatch = service.createDispatch(
                QNAME_PORT, Source.class, Mode.MESSAGE);
        
        // Create the Source object with the message contents.  Since
        // we're in MESSAGE mode, we'll need to make sure we create this
        // with the right protocol.
        byte[] bytes = sampleEnvelope_MustUnderstand.getBytes();
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        StreamSource request = new StreamSource(bais);
        
        SOAPFaultException e = null;
        try {
            @SuppressWarnings("unused")
            Source response = dispatch.invoke(request);
            throw new RuntimeException("We should have an exception, but
none was thrown.", e);
        } catch (SOAPFaultException ex) {
            System.out.println("ok, exception expected");
            e = ex;
            

            if (!
"MustUnderstand".equals(e.getFault().getFaultCodeAsQName().getLocalPart())) {
                throw new RuntimeException("FaultCode should be
\"MustUnderstand\"");
            }
        }
    }
    
    
    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        BasicConfigurator.configure();
        SOAP12Dispatch dispatch = new SOAP12Dispatch();
        dispatch.testSOAP12DispatchPayloadMode();
    }

}



When I run it I get this error on the client side, it doesn't matter
whether the endpoint is 
http://localhost:8080/axis2/services/SOAP12Provider
or
http://localhost:8080/axis2/services/SOAP12ProviderService


4894 [main] DEBUG
org.apache.axis2.jaxws.message.util.impl.SAAJConverterImpl  - Converting
OMElement to an SAAJ SOAPElement
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: The
endpoint reference (EPR) for the Operation not found is
127.0.0.1/axis2/services/SOAP12Provider and the WSA Action =
urn:anonOutInOp
	at
org.apache.axis2.jaxws.marshaller.impl.alt.MethodMarshallerUtils.createSystemException(MethodMarshallerUtils.java:1192)
	at
org.apache.axis2.jaxws.client.dispatch.BaseDispatch.getFaultResponse(BaseDispatch.java:405)
	at
org.apache.axis2.jaxws.client.dispatch.BaseDispatch.invoke(BaseDispatch.java:170)
	at
service.jaxws.SOAP12Dispatch.testSOAP12DispatchPayloadMode(SOAP12Dispatch.java:81)
	at service.jaxws.SOAP12Dispatch.main(SOAP12Dispatch.java:205)



Any idea?

Michele

On Thu, 2007-10-11 at 13:03 -0500, Nicholas L Gallardo wrote:
> There are also a number of examples in the JAX-WS test bucket. 
> 
> Look at org.apache.axis2.jaxws.dispatch.*
> 
> -Nick
> 
> Inactive hide details for Brian De Pradine <PRADINE@uk.ibm.com>Brian
> De Pradine <PRADINE@uk.ibm.com>
> 
> 
>                                 Brian De Pradine <PRADINE@uk.ibm.com> 
>                                 
>                                 10/11/2007 07:02 AM 
>                                 Please respond to
>                                 axis-user@ws.apache.org
>                                 
> 
>                To
> 
> axis-user@ws.apache.org
> 
>                cc
> 
> 
> 
>           Subject
> 
> Re: [Axis2]
> JAX-WS & working
> at xml level on
> the client side
> 
> 
> 
> 
> Hello Michele, 
> 
> You can find info about dispatch clients at [1]. 
> 
> [1] https://jax-ws.dev.java.net/nonav/2.1.2/docs/dispatch.html 
> 
> Cheers
> 
> Brian DePradine
> Web Services Development
> IBM Hursley
> External +44 (0) 1962 816319 Internal 246319
> 
> If you can't find the time to do it right the first time, where will
> you find the time to do it again?
> 
> 
> Michele Mazzucco <Michele.Mazzucco@ncl.ac.uk> wrote on 11/10/2007
> 12:47:39:
> 
> > Hi Brian,
> > 
> > what do you mean?, do you have any example?
> > 
> > Thanks,
> > Michele
> > 
> > On Thu, 2007-10-11 at 12:45 +0100, Brian De Pradine wrote:
> > > 
> > > Hello Michele, 
> > > 
> > > Try creating a dispatch client. 
> > > 
> > > Cheers
> > > 
> > > Brian DePradine
> > > Web Services Development
> > > IBM Hursley
> > > External  +44 (0) 1962 816319         Internal 246319
> > > 
> > > If you can't find the time to do it right the first time, where
> will
> > > you find the time to do it again?
> > > 
> > > 
> > > Michele Mazzucco <Michele.Mazzucco@ncl.ac.uk> wrote on 11/10/2007
> > > 10:57:35:
> > > 
> > > > Hi all,
> > > > 
> > > > I understand that by implementing the javax.xml.ws.Provider
> > > interface
> > > > it's possible to work at low level (i.e. to control the XML
> which is
> > > > sent back and forth).
> > > > Now, if I have a service which implements the Provider interface
> is
> > > > there any way to work at low level on the client side as well,
> that
> > > is
> > > > the same way as ServiceClient + RawXML.. msg. receivers + Axiom?
> > > > 
> > > > 
> > > > Thanks,
> > > > Michele
> > > > 
> > > > 
> > > >
> > >
> ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > > > For additional commands, e-mail: axis-user-help@ws.apache.org
> > > > 
> > > 
> > > 
> > > 
> > > 
> > >
> ______________________________________________________________________
> > > 
> > > 
> > > 
> > > 
> > > Unless stated otherwise above:
> > > IBM United Kingdom Limited - Registered in England and Wales with
> > > number 741598. 
> > > Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire
> PO6
> > > 3AU 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > 
> > 
> >
> ---------------------------------------------------------------------
> > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > For additional commands, e-mail: axis-user-help@ws.apache.org
> > 
> 
> 
> 
> 
> 
> 
> ______________________________________________________________________
> 
> 
> 
> Unless stated otherwise above:
> IBM United Kingdom Limited - Registered in England and Wales with
> number 741598. 
> Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6
> 3AU 
> 
> 
> 
> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org


Mime
View raw message