用于具有基本身份验证

时间:2015-05-01 13:52:41

标签: java web-services wsdl axis2 java-client

我是Web服务的新手,我正在尝试使用Axis2使用Eclipse Web Service Client自动生成的存根创建Java客户端。以下是我的

client code. public static void main(String[] args) {
        new wsClient2().runService();
    }

public void runService(){

    try {

    CoreStub.COREEnvelopeRealTimeRequest req = new CoreStub.COREEnvelopeRealTimeRequest();
    CoreStub.COREEnvelopeRealTimeResponse res = new CoreStub.COREEnvelopeRealTimeResponse();

    req.setCORERuleVersion("2.2.0");
    req.setPayload("....some data over here...... Can't disclose");
    req.setPayloadID("..payload id goes here... can't disclose");
    req.setPayloadType("X12_276_Request_005010X212");

    RealTimeMode rtm = new RealTimeMode();
    rtm.setRealTimeMode("RealTime");
    req.setProcessingMode(rtm);
    req.setReceiverID("myreceiverid");
    req.setSenderID("mysenderid");
    req.setTimeStamp("2015-04-14 10:27:47");



    HttpTransportProperties.Authenticator basicAuthentication = new HttpTransportProperties.Authenticator();
    basicAuthentication.setUsername("myusername");
    basicAuthentication.setPassword("mypassword");
    basicAuthentication.setPreemptiveAuthentication(true);

    CoreStub _stub = new CoreStub();
    ServiceClient clientservice = _stub._getServiceClient();


    _stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE, basicAuthentication);
    _stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED, "false");


    OMFactory factory2 = OMAbstractFactory.getOMFactory();

    OMNamespace SecurityElementNamespace = factory2.createOMNamespace("http://schemas.xmlsoap.org/ws/2002/12/secext", "wsse");

    OMElement omSecurityElement = factory2.createOMElement(new QName( "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security", "wsse"), null);

    //OMElement usernameEl = factory2.createOMElement(new QName("", "Username", "wsse"), null);
    OMElement usernameEl = factory2.createOMElement(new QName("", "Username", "wsse"), null);

    usernameEl.setText("myusername");

    OMElement passwordEl = factory2.createOMElement(new QName("", "Password", "wsse"), null);
    passwordEl.addAttribute("Type","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText",null );
    passwordEl.setText("mypassword");

    OMElement usernameTokenEl = factory2.createOMElement(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "UsernameToken", "wsu"), null);

    usernameTokenEl.addChild(usernameEl);
    usernameTokenEl.addChild(passwordEl);

    omSecurityElement.addChild(usernameTokenEl);

    clientservice.addHeader(omSecurityElement);

    try {
        DisableSSLCertificateCheck();

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("Test");
    //System.out.println(clientservice.getLastOperationContext().getMessageContext("Out").getEnvelope().toString());

    System.out.println("Request created as: " + req.toString());

    res = _stub.realTimeTransaction(req);

    System.out.println("Version : " + res.getCORERuleVersion());
    System.out.println("Error Code :" + res.getErrorCode());
    System.out.println("Error Message:" + res.getErrorMessage());
    //System.out.println("Pay Load :" + res.getPayload());
    //System.out.println("Pay Load Type :" + res.getPayloadType());
    System.out.println("Receiver Id :" + res.getReceiverID());
    System.out.println("Sender Id :" + res.getSenderID());

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

    }
}

我正在追踪异常

  

java.lang.IllegalArgumentException:无法创建带前缀的元素   在空的命名空间名称   org.apache.axiom.om.impl.llom.OMElementImpl.handleNamespace(OMElementImpl.java:186)     在   org.apache.axiom.om.impl.llom.OMElementImpl。(OMElementImpl.java:161)     在   org.apache.axiom.om.impl.llom.factory.OMLinkedListImplFactory.createOMElement(OMLinkedListImplFactory.java:126)     在   org.myownpackage.www.soap.wsdl.wsClient2.runService(wsClient2.java:81)     在org.myownpackage.www.soap.wsdl.wsClient2.main(wsClient2.java:37)

在以下行中,不允许使用空白字符串。我应该在这里解决这个问题

  OMElement usernameEl = factory2.createOMElement(
                               new QName("", "Username", "wsse"), null
                             );

非常感谢更快的帮助。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您是否尝试将用户令牌节点中的用户名和密码节点包装为in this question

另外,查看建议的oasis docs

select i.*
from (select i.*,
             row_number() over (partition by groupid, datediff(day, minct, createdtimestamp) / 365 
                                order by CreatedTimestamp
                               ) as seqnum
      from (select i.*, min(CreatedTimestamp) over (partition by groupid) as minct
            from #items i
           ) i
     ) i
where seqnum = 1;

答案 1 :(得分:0)

您不应该使用

new QName("", "Username", "wsse")

用于生成没有xmlns的显式设置为XML标记。相反,您应该将Username的名称空间值设置为其父UserToken使用的名称空间值完全相同。当生成XML时,这个重合的名称空间将被考虑为inot帐户,并且将完全按照您的期望来生成子元素,而不会将任何xmlns部分提供给标签。因此,下面的Stub类中的脏代码由axis2:wsdl2code生成,对我有帮助:

    public void addWsSecurityHeader(String wsUser, String wsPass)
        {

    OMFactory omFactory = OMAbstractFactory.getOMFactory();
    OMElement omSecurityElement = omFactory.createOMElement(new QName( "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security", "wsse"), null);
            omSecurityElement.addAttribute("xmlns:wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-%20wssecurity-utility-1.0.xsd",  null);


    OMElement omusertoken = omFactory.createOMElement(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "UsernameToken", "wsse"), null);
    omusertoken.addAttribute("wsu:Id","UsernameToken-87",null );

    OMElement omuserName = omFactory.createOMElement(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd","Username", "wsse"), null);
    omuserName.setText(wsUser);

    OMElement omPassword = omFactory.createOMElement(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd","Password", "wsse"), null);
    omPassword.addAttribute("Type","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText",null );
    omPassword.setText(wsPass);

    omusertoken.addChild(omuserName);
    omusertoken.addChild(omPassword);
    omSecurityElement.addChild(omusertoken);
    this._getServiceClient().addHeader(omSecurityElement);
}

但是我还没有找到如何为同一标签设置多个xmlns的方法,因此我做了一个肮脏的技巧来创建第二个xmlns作为标签属性。可能是我错了,但它奏效了。