Axis安全标头

yur*_*url 7 java soap axis2 header soap-client

您好试图在Java Axis2客户端程序中以格式生成安全标头.

<soapenv:Header>
 <wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext>
  <wsse:UsernameToken>
   <wsse:Username>myUsername</wsse:Username>
   <wsse:Password>myPassword</wsse:Password>
  </wsse:UsernameToken>
 </wsse:Security>
</soapenv:Header>
Run Code Online (Sandbox Code Playgroud)

使用以下代码

SOAPHeaderElement wsseSecurity = new SOAPHeaderElement(new PrefixedQName("http://schemas.xmlsoap.org/ws/2002/04/secext","Security", "wsse"));
MessageElement usernameToken = new MessageElement("", "wsse:UsernameToken");
MessageElement username = new MessageElement("", "wsse:Username");
MessageElement password = new MessageElement("", "wsse:Password");
username.setObjectValue(myProps.getProperty("username"));
usernameToken.addChild(username);
password.setObjectValue(myProps.getProperty("password"));
usernameToken.addChild(password);
wsseSecurity.addChild(usernameToken);

BookingPort bp = bsl.getBooking();
((Stub) bp).setHeader(wsseSecurity);
Run Code Online (Sandbox Code Playgroud)

不幸的是,它并没有产生我想要的东西而且我得到了.

<soapenv:Header>
 <wsse:Security soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext">
  <wsse:UsernameToken xmlns:wsse="">
   <wsse:Username xmlns:wsse="">myUsername</wsse:Username>
   <wsse:Password xmlns:wsse="">myPassword</wsse:Password>
  </wsse:UsernameToken>
 </wsse:Security>
</soapenv:Header>
Run Code Online (Sandbox Code Playgroud)

另一端的服务似乎没有处理额外的位,导致错误

faultDetail:
        {http://xml.apache.org/axis/}stackTrace:com.ctc.wstx.exc.WstxParsingException: Non-default namespace can not map to empty URI (as per Namespace 1.0 # 2) in XML 1.0 documents
 at [row,col {unknown-source}]: [1,450]
Run Code Online (Sandbox Code Playgroud)

如何生成SOAPHeader以不打印出所有额外的空位?干杯

Jus*_*ick 6

你传递一个空字符串作为MessageElement的第一个参数,你需要传递null.请注意,null空字符串("")与Java中的不一样.此外,您通过将名称空间前缀传递给MessageElement构造函数的本地名称(第二个)参数来实际作弊...这不是它的设计目的.话虽这么说,你可以通过传递null名称空间(第一个)参数来解决问题.如果您尝试直接传递它,则可能会出现模糊的构造函数错误,因此请执行以下操作:

SOAPHeaderElement wsseSecurity = new SOAPHeaderElement(new PrefixedQName("http://schemas.xmlsoap.org/ws/2002/04/secext","Security", "wsse"));
String nullString = null;
MessageElement usernameToken = new MessageElement(nullString, "wsse:UsernameToken");
MessageElement username = new MessageElement(nullString, "wsse:Username");
MessageElement password = new MessageElement(nullString, "wsse:Password");
username.setObjectValue(myProps.getProperty("username"));
usernameToken.addChild(username);
password.setObjectValue(myProps.getProperty("password"));
usernameToken.addChild(password);
wsseSecurity.addChild(usernameToken);

BookingPort bp = bsl.getBooking();
((Stub) bp).setHeader(wsseSecurity);
Run Code Online (Sandbox Code Playgroud)

如果您有任何选择,我还建议您使用不同的Web服务引擎(不是Axis2).