Simple axis 2 service fails invocation

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Simple axis 2 service fails invocation

Paul Nibin
Hi all,

       I am trying to invoke a simple web service.

public class SimpleTestVoid
{
    public void printMessage() throws Exception
    {
        System.out.println( "Hello world" );
    }
}


The WSDL is generated fine. Generated the client. But when invoking the service, I am getting an exception.

java.lang.UnsupportedOperationException: An access occurred that is not valid.
        at org.apache.axis2.description.InOnlyAxisOperation.getMessage(InOnlyAxisOperation.java:117)
        at org.apache.axis2.util.MessageContextBuilder.createOutMessageContext(MessageContextBuilder.java:183)
        at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:37)
        at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:173)
        at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:167)
        at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:142)

I debugged some part of the code.

When the service is deployed, according to the signature of the method, it is creating a InOnlyAxisOperation with "robust-in-only" as the message exchange pattern( it is not taking any input params and throwing an exception).


org.apache.axis2.deployment.util.UtilsgetAxisOperationForJmethod()

     if ("void".equals(method.getReturnType().getName())) {
            if (method.getExceptionTypes().length > 0) {
                operation = AxisOperationFactory
                        .getAxisOperation(WSDLConstants.MEP_CONSTANT_ROBUST_IN_ONLY);
            } else {
                operation = AxisOperationFactory
                        .getAxisOperation(WSDLConstants.MEP_CONSTANT_IN_ONLY);
            }

If MEP_CONSTANT_IN_ONLY message exchange pattern is used, then all works fine. But if there a method which does not take any input parameters and throws some exception, then this issue comes.

org.apache.axis2.description.AxisOperationFactory.getAxisOperation(int mepURI)

            case WSDLConstants.MEP_CONSTANT_ROBUST_IN_ONLY : {
                abOpdesc = new InOnlyAxisOperation();
                abOpdesc.setMessageExchangePattern(WSDL2Constants.MEP_URI_ROBUST_IN_ONLY);
                break;

So when the invoking the method using a client, in org.apache.axis2.util.MessageContextBuilder.createOutMessageContext(MessageContext inMessageContext)

if (ao != null){
           newmsgCtx.setAxisMessage(ao.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE));
        }

Since a0 is a org.apache.axis2.description.InOnlyAxisOperation, the following getMessage is invoked, so it is throwing this UnsupportedOperationException.

public AxisMessage getMessage(String label) {
        if (WSDLConstants.MESSAGE_LABEL_IN_VALUE.equals(label)) {
            return (AxisMessage) getChild("inMessage");
        } else {
            throw new UnsupportedOperationException(Messages.getMessage("invalidacess"));
        }
    }

If any more info is required please let me know. Hoping for a response..

Please.. I need help with this one...

Thanks,
Paul