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<String> 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 <[EMAIL PROTECTED]>Brian
> De Pradine <[EMAIL PROTECTED]>
>
>
> Brian De Pradine <[EMAIL PROTECTED]>
>
> 10/11/2007 07:02 AM
> Please respond to
> [email protected]
>
>
> To
>
> [email protected]
>
> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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: [EMAIL PROTECTED]
> > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > >
> > >
> > >
> > >
> > >
> > >
> ______________________________________________________________________
> > >
> > >
> > >
> > >
> > > 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: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
>
>
>
>
>
>
> ______________________________________________________________________
>
>
>
> 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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]