我是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
);
非常感谢更快的帮助。 提前谢谢。
答案 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作为标签属性。可能是我错了,但它奏效了。