以下OutInterceptor攔截器代碼部分實作,因為webservice回傳報文太長,導致資料無法回寫到流中,無法拿到回傳報文,最終xml = IOUtils.toString(in); 為null,求大大們幫忙解決啊。。。
//獲取介面回傳資訊
OutputStream os = message.getContent(OutputStream.class);
CachedStream cs = new CachedStream();
message.setContent(OutputStream.class, cs);
message.getInterceptorChain().doIntercept(message);
CachedOutputStream csnew = (CachedOutputStream) message
.getContent(OutputStream.class);
InputStream in = csnew.getInputStream();
//獲取回傳報文
xml = IOUtils.toString(in);
//決議回傳報文
Document document = DocumentHelper.parseText(xml);
uj5u.com熱心網友回復:
目前發現,基于cxf實作的webservice介面回傳字串太長的時候,會造成OutInterceptor攔截器中的SoapMessage的buf流為null,如果想要在攔截器中分析報文,顯然會有問題,具體原因未找到,通過分析原始碼Message.getContent(Class<T> format) 方法來獲取資訊,可傳引數為(XMLStreamReader.class, XMLStreamWriter.class, InputStream.class, OutputStream.class, List.class, Exception.class, Node.class, DelegatingInputStream.class),由于流中是null,因此message.getContent(OutputStream.class)是行不通的,通過webService回傳獲取回傳值是通過List獲取(目前看是這樣),因此我的解決辦法是message.getContent(List.class);獲取List ,通過反射來拿報文:List list = message.getContent(List.class);
for(Object o : list){
System.out.println("=========="+o.getClass());
Class oas = o.getClass();
Field[] fs = oas.getDeclaredFields();
for(int i = 0 ; i < fs.length; i++){
Field f = fs[i];
f.setAccessible(true);
Object val = f.get(o);
}
uj5u.com熱心網友回復:
@Override
public void handleMessage(Message message) throws Fault {
try {
OutputStream os = message.getContent(OutputStream.class);
ByteArrayOutputStream cs = new ByteArrayOutputStream();
message.setContent(OutputStream.class, cs);
message.getInterceptorChain().doIntercept(message);
ByteArrayOutputStream csnew = (ByteArrayOutputStream) message.getContent(OutputStream.class);
ByteArrayInputStream bis = new ByteArrayInputStream(csnew.toByteArray());
String json = IOUtils.toString(bis);
InterfaceAccessLog interfaceAccessLog =InterfaceAccessLogHolder.getInterfaceAccessLog();
interfaceAccessLog.setResponse(changeJsonstr(json));
interfaceAccessLog.setUpdatetime(new Date());
service.insertInterfaceAccessLog(interfaceAccessLog);
IOUtils.copy(new ByteArrayInputStream(json.getBytes("utf-8")), os);
cs.close();
os.flush();
message.setContent(OutputStream.class, os);
} catch (IOException e) {
e.printStackTrace();
}
}
完美解決
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/56655.html
標籤:Java相關
