首先吐槽一句,網上的各位“大神”,你們的代碼或者轉載前都測試過嗎?或者哪怕你說一下你的環境(版本)也好啊!
服務端獲取Header數據
先說一說我的是什麼Header數據(以下圖片來自於soapUI工具,CXF包爲3.2.5):
1、添加自定義Header數據
2、通過RAW模式查看我們的Header。非上圖中XML代碼中的<soap:Header>
OK,這就是我們自定義的Header。下面看看是怎麼獲取的。
public class ReadSoapHeader extends AbstractPhaseInterceptor<SoapMessage> {
public ReadSoapHeader() {
super(Phase.PRE_PROTOCOL);
getAfter().add(SAAJInInterceptor.class.getName());
}
public void handleMessage(SoapMessage message) throws Fault {
TreeMap<String, ArrayList<Object>> tree = (TreeMap<String, ArrayList<Object>>) message.get(Message.PROTOCOL_HEADERS);
System.out.println("==============="+(tree.get("username").get(0)));
}
}
是不是感覺很簡單,對,沒錯,其實就是這麼簡單。至於我是怎麼發現使用這種方式的?當然是萬能的debug了,通過debug模式查看message裏面到底有什麼東西?
通過上面的debug我們可以看到message是Map模式,通過get(key),可以獲得相應的值。再次發現key爲Message.PROTOCOL_HEADERS,返回的是TreeMap型,而TreeMap的key就是我們定義的Header中的key,只是value是ArrayList類型。
雖然只是簡單的問題,但是盡信書,不如無書啊。不要懷疑自己,有可能是方法不對!!!
客戶端傳遞數據
同服務端一樣的道理,在服務端在Map裏面取,我們就在客戶端往Map裏面塞數據:
public class SoapHeaderInterceptor extends AbstractSoapInterceptor
{
public SoapHeaderInterceptor()
{
super(Phase.WRITE);
}
public void handleMessage(SoapMessage message) throws Fault
{
TreeMap<String, ArrayList<String>> map = (TreeMap<String, ArrayList<String>>)message.get(Message.PROTOCOL_HEADERS);
ArrayList<String> al = new ArrayList<String>();
al.add("111");
ArrayList<String> a2 = new ArrayList<String>();
a2.add("222");
map.put("username", al);
map.put("password" , a2);
}
}
public static void main(String[] args) {
URL wsdlURL = UserServiceService.WSDL_LOCATION;
UserServiceService ss = new UserServiceService(wsdlURL, SERVICE_NAME);
IUserService port = ss.getUserServicePort();
System.out.println("Invoking queryStations...");
Client client = ClientProxy.getClient(port);
client.getOutInterceptors().add(new SoapHeaderInterceptor());
String user = port.getUser();
System.out.println("user = " + user);
}