axis-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Brian De Pradine <PRAD...@uk.ibm.com>
Subject Re: [Axis2] JAX-WS & working at xml level on the client side
Date Sat, 13 Oct 2007 11:16:59 GMT
Hello Michele,

It appears that the request cannot be dispatched based solely on the 
content of the SOAP body. Try setting the SOAPAction explicitly before you 
call dispatch.invoke()

            Map<String, Object> map = dispatch.getRequestContext();
            map.put(BindingProvider.SOAPACTION_USE_PROPERTY, 
Boolean.TRUE);
            map.put(BindingProvider.SOAPACTION_URI_PROPERTY, "...");

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 12/10/2007 
10:22:35:

> 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
> 






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






Mime
View raw message