AnsweredAssumed Answered

Wervices SOAP Header error (soapEnvelopeHeader)

Question asked by baltaromero on Mar 17, 2010
Hi I've the same problem you reported on the first post. When I execute the update method of the RepositoryServiceStub generated using Axis i get the following exception.

org.apache.axis2.AxisFault: WSDoAllReceiver: Request does not contain required Security header

Debugging RepositoryServiceStub's code i can see that the generated SoapEnvelope does not contain the Header it only contains the body <env:body>.

Patrickov you said you have solved the problem using the wsdd file. Can you give any tips in how to using cause i'm a begginer with Axis and not sure how this should work.


I fixed the problem by making use of the sample client deployment WSDD file.



You can see in this part of the update method i's creating the soap envelope and intends to attach the header but debugging i can see it makes no difference.

env = toEnvelope(
               getFactory(_operationClient.getOptions()
                     .getSoapVersionURI()),
               update23,
               optimizeContent(new javax.xml.namespace.QName(
                     "http://www.alfresco.org/ws/service/repository/1.0",
                     "update")));

           _serviceClient.addHeadersToEnvelope(env);
          // set the message context with that soap envelope
         _messageContext.setEnvelope(env);

         // add the message contxt to the operation client
         _operationClient.addMessageContext(_messageContext);

         // execute the operation client
         _operationClient.execute(true);


Here's the complete code for the update method

public RepositoryServiceStub.UpdateResponse update(

   RepositoryServiceStub.Update update23)

   throws java.rmi.RemoteException

   , RepositoryFaultException {
      org.apache.axis2.context.MessageContext _messageContext = null;
      try {
         org.apache.axis2.client.OperationClient _operationClient = _serviceClient
               .createClient(_operations[8].getName());
         _operationClient.getOptions().setAction(
               "http://www.alfresco.org/ws/service/repository/1.0/update");
         _operationClient.getOptions().setExceptionToBeThrownOnSOAPFault(
               true);

         addPropertyToOperationClient(
               _operationClient,
               org.apache.axis2.description.WSDL2Constants.ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR,
               "&");

         // create a message context
         _messageContext = new org.apache.axis2.context.MessageContext();

         // create SOAP envelope with that payload
         org.apache.axiom.soap.SOAPEnvelope env = null;

         env = toEnvelope(
               getFactory(_operationClient.getOptions()
                     .getSoapVersionURI()),
               update23,
               optimizeContent(new javax.xml.namespace.QName(
                     "http://www.alfresco.org/ws/service/repository/1.0",
                     "update")));

         // adding SOAP soap_headers
         //_serviceClient.addHeader(header);
          Options options = _serviceClient.getOptions();

            options.setUserName("admin");
            options.setPassword("admin");

            _serviceClient.addHeadersToEnvelope(env);
             _serviceClient.setOptions(options);
         // set the message context with that soap envelope
         _messageContext.setEnvelope(env);

         // add the message contxt to the operation client
         _operationClient.addMessageContext(_messageContext);

         // execute the operation client
         _operationClient.execute(true);

         org.apache.axis2.context.MessageContext _returnMessageContext = _operationClient
               .getMessageContext(org.apache.axis2.wsdl.WSDLConstants.MESSAGE_LABEL_IN_VALUE);
         org.apache.axiom.soap.SOAPEnvelope _returnEnv = _returnMessageContext
               .getEnvelope();

         java.lang.Object object = fromOM(_returnEnv.getBody()
               .getFirstElement(),
               RepositoryServiceStub.UpdateResponse.class,
               getEnvelopeNamespaces(_returnEnv));

         return (RepositoryServiceStub.UpdateResponse) object;

      } catch (org.apache.axis2.AxisFault f) {

         org.apache.axiom.om.OMElement faultElt = f.getDetail();
         if (faultElt != null) {
            if (faultExceptionNameMap.containsKey(faultElt.getQName())) {
               // make the fault by reflection
               try {
                  java.lang.String exceptionClassName = (java.lang.String) faultExceptionClassNameMap
                        .get(faultElt.getQName());
                  java.lang.Class exceptionClass = java.lang.Class
                        .forName(exceptionClassName);
                  java.lang.Exception ex = (java.lang.Exception) exceptionClass
                        .newInstance();
                  // message class
                  java.lang.String messageClassName = (java.lang.String) faultMessageMap
                        .get(faultElt.getQName());
                  java.lang.Class messageClass = java.lang.Class
                        .forName(messageClassName);
                  java.lang.Object messageObject = fromOM(faultElt,
                        messageClass, null);
                  java.lang.reflect.Method m = exceptionClass.getMethod(
                        "setFaultMessage",
                        new java.lang.Class[] { messageClass });
                  m.invoke(ex, new java.lang.Object[] { messageObject });

                  if (ex instanceof RepositoryFaultException) {
                     throw (RepositoryFaultException) ex;
                  }

                  throw new java.rmi.RemoteException(ex.getMessage(), ex);
               } catch (java.lang.ClassCastException e) {
                  // we cannot intantiate the class - throw the original
                  // Axis fault
                  throw f;
               } catch (java.lang.ClassNotFoundException e) {
                  // we cannot intantiate the class - throw the original
                  // Axis fault
                  throw f;
               } catch (java.lang.NoSuchMethodException e) {
                  // we cannot intantiate the class - throw the original
                  // Axis fault
                  throw f;
               } catch (java.lang.reflect.InvocationTargetException e) {
                  // we cannot intantiate the class - throw the original
                  // Axis fault
                  throw f;
               } catch (java.lang.IllegalAccessException e) {
                  // we cannot intantiate the class - throw the original
                  // Axis fault
                  throw f;
               } catch (java.lang.InstantiationException e) {
                  // we cannot intantiate the class - throw the original
                  // Axis fault
                  throw f;
               }
            } else {
               throw f;
            }
         } else {
            throw f;
         }
      } finally {
         _messageContext.getTransportOut().getSender().cleanup(
               _messageContext);
      }
   }



Thanks for your time

Outcomes