Hi,

  I've generated my WSDL client with CXF 2.7.0 (from 2.7.1 I get a NPE at
generation time, didn't find a workaround).

  When I use the client I get a NPE on the server side, while with SOAPUI
it's ok.

  I used TCPMon to compare SOAPUI and CXF soap request and I can see that
CXF client do not send the SOAPaction.


Questions :

   - What should I do to have CXF client send the SAOPAction ?
   - SAOPUI uses UsernameToken-9, CXF uses UsernameToken-1. I didn't find a
   way to use the-9 version. what's the difference ?
   - SAOPUI add timestamp and nonce something... How can I do the same with
   CXF ?  Is it necessary ?




CXF Request :

<!--

POST /*amxbpm*/WorkListService HTTP/1.1

Content-Type: text/*xml*; *charset*=UTF-8

Accept: */*

SOAPAction: ""

User-Agent: *Apache* CXF 2.7.5

Cache-Control: no-cache

*Pragma*: no-cache

Host: xivertbid05.ermont.infra.sncf.fr:8888

Connection: keep-alive

Content-Length: 1090

 -->

<soap:Envelope xmlns:soap=*"http://schemas.xmlsoap.org/soap/envelope/"*>

       <SOAP-ENV:Header xmlns:SOAP-ENV=*"
http://schemas.xmlsoap.org/soap/envelope/"*>

             <wsse:Security

                    xmlns:wsse=*"
http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd
"*

                    xmlns:wsu=*"
http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd
"*

                    soap:mustUnderstand=*"1"*>

                    <wsse:UsernameToken wsu:Id=*"UsernameToken-1"*>

                           <wsse:Username>*tibco*-*admin*</wsse:Username>

                           <wsse:Password

                                  Type=*"
http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText
"*>secret</wsse:Password>

                    </wsse:UsernameToken>

             </wsse:Security>

       </SOAP-ENV:Header>

       <soap:Body>

             <ns1:getWorkListItems xmlns:ns1=*"http://api.brm.n2.tibco.com"*
>

                    <ns1:getWorkListItems xmlns=*""*

                           xmlns:ns3=*"http://exception.api.brm.n2.tibco.com
"* xmlns:ns4=*"http://exception.api.common.n2.tibco.com"*

                           getTotalCount=*"true"* numberOfItems=*"10"*
startPosition=*"0"*>

                           <entityID entity-type=*"RESOURCE"* guid=*
"tibco-admin"*

                                  model-version=*"-1"* />

                           <orderFilterCriteria />

                    </ns1:getWorkListItems>

             </ns1:getWorkListItems>

       </soap:Body>

</soap:Envelope>


SOAPUI Request

 <!--

POST /amxbpm/WorkListService HTTP/1.1

Accept-Encoding: gzip,deflate

Content-Type: text/xml;charset=UTF-8

SOAPAction: "getWorkListItems"

Content-Length: 1110

Host: xivertbid05.ermont.infra.sncf.fr:8888

Connection: Keep-Alive

User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

 -->



<soapenv:Envelope xmlns:api=*"http://api.brm.n2.tibco.com"*

       xmlns:soapenv=*"http://schemas.xmlsoap.org/soap/envelope/"*>

       <soapenv:Header>

             <wsse:Security

                    xmlns:wsse=*"
http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd
"*

                    xmlns:wsu=*"
http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd
"*>

                    <wsse:UsernameToken wsu:Id=*"UsernameToken-9"*>

                           <wsse:Username>tibco-admin</wsse:Username>

                           <wsse:Password

                                  Type=*"
http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText
"*>secret</wsse:Password>

                           <wsse:Nonce

                                  EncodingType=*"
http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary
"*>wATZQZmZIUEMuYWA8YrN1g==</wsse:Nonce>

                           <wsu:Created>2013-06-14T08:36:06.565Z</
wsu:Created>

                    </wsse:UsernameToken>

             </wsse:Security>

       </soapenv:Header>

       <soapenv:Body>

             <api:getWorkListItems getTotalCount=*"true"*

                    numberOfItems=*"10"* startPosition=*"0"*>

                    <entityID entity-type=*"RESOURCE"* guid=*"tibco-admin"*

                           model-version=*"-1"*>



                    </entityID>



             </api:getWorkListItems>

       </soapenv:Body>

</soapenv:Envelope>

Java Code :

package com.test.webService;


import java.util.List;

import com.tibco.n2.brm.api.GetWorkListItems;
import com.tibco.n2.brm.api.GetWorkListItemsResponse;
import com.tibco.n2.brm.api.OrderFilterCriteria;
import com.tibco.n2.brm.api.WorkItem;
import com.tibco.n2.brm.services.WorkListService;
import com.tibco.n2.common.organisation.api.OrganisationalEntityType;
import com.tibco.n2.common.organisation.api.XmlModelEntityId;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.xml.namespace.QName;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.frontend.ClientProxyFactoryBean;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.WSPasswordCallback;
import org.apache.ws.security.handler.WSHandlerConstants;
import org.springframework.beans.factory.InitializingBean;


public class ArticWorkListService  implements InitializingBean
{
    private WorkListService workListService = null;

    public ArticWorkListService()
    {

        this.workListService = ArticWorkListService.create();
    }

    public static WorkListService create()
    {

        String     endpoint = "http://localhost:8888/amxbpm/WorkListService
";
        int     timeout     = 60;
        String     username = "tibco-admin";
        final String     password = "secret";


        ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
        factory.setServiceClass(WorkListService.class);
        factory.setAddress(endpoint);
        factory.setServiceName(new QName("http://api.brm.n2.tibco.com
","WorkListService_EP"));
        WorkListService workListService = (WorkListService)
factory.create();

        Client client = ClientProxy.getClient(workListService);

        Map<String,Object> properties = new HashMap<String, Object>();
        properties.put(WSHandlerConstants.ACTION,
WSHandlerConstants.USERNAME_TOKEN);
        properties.put(WSHandlerConstants.USER,username);
        properties.put(WSHandlerConstants.PASSWORD_TYPE,
WSConstants.PW_TEXT );//"PasswordDigest"
        properties.put(WSHandlerConstants.PW_CALLBACK_REF,new
CallbackHandler()
        {
            public void handle(Callback[] callbacks) throws
IOException,UnsupportedCallbackException
            {
                WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
                pc.setPassword(password);
            }
        });

        client.getOutInterceptors().add(new
WSS4JOutInterceptor(properties));

        HTTPConduit conduit = (HTTPConduit) client.getConduit();

        long timeoutMillis = timeout * 1000;

        HTTPClientPolicy policy = new HTTPClientPolicy();
        policy.setConnectionTimeout(timeoutMillis);
        policy.setReceiveTimeout(timeoutMillis);

        conduit.setClient(policy);

        return workListService;
    }







    public String[] getWorklistItemsIds()
    {
        String[] ids = null;

        XmlModelEntityId entityId = new XmlModelEntityId();
        entityId.setGuid("tibco-admin");
        entityId.setEntityType(OrganisationalEntityType.RESOURCE);
        entityId.setModelVersion(-1);



        GetWorkListItems getWorkListItems = new GetWorkListItems( );

        getWorkListItems.setGetTotalCount(true);
        getWorkListItems.setEntityID(entityId);
        getWorkListItems.setStartPosition(0);
        getWorkListItems.setNumberOfItems(10l);
        getWorkListItems.setOrderFilterCriteria(new OrderFilterCriteria());



        GetWorkListItemsResponse getWorkListItemsResponse = null;

        try
        {
            getWorkListItemsResponse =
this.workListService.getWorkListItems(getWorkListItems);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        if(getWorkListItemsResponse == null)
        {
            return new String[]{"null results"};
        }

        List<WorkItem> workitems = getWorkListItemsResponse.getWorkItems();

        ids = new String[workitems.size()];
        int i = 0;
        for (WorkItem workItem : workitems)
        {
            ids[i++] =
workItem.getHeader().getItemContext().getActivityID()+"-" +

workItem.getHeader().getItemContext().getActivityName()+"-" +

workItem.getHeader().getItemContext().getAppID()+"-" +

workItem.getHeader().getItemContext().getAppInstance()+"-" +

workItem.getHeader().getItemContext().getAppInstanceDescription()+"-" +

workItem.getHeader().getItemContext().getAppName()+"-" +
                        workItem.getId().getId();
        }
        return ids;
    }

    @Override
    public void afterPropertiesSet() throws Exception
    {
        try
        {
            String [] ids = this.getWorklistItemsIds();

            for (String string : ids) {
                System.err.println(string);
            }

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

}

Reply via email to