java.lang.NullPointerException в org.apache.cxf.attachment.LazyDataSource.getInputStream
Я использую cxf 2.7.7 и использую MTOM с https... и он работает нормально с клиентом cxf java. Однако когда я отправляю сообщение через клиент SOAP UI и на стороне сервера (в моем классе реализации конечной точки) я пытаюсь получить доступ к любому из методов объекта Datahandler (см. Сокращенный код ниже), тогда я получаю java.lang.NullPointerException в org.apache.cxf.attachment.LazyDataSource. Обратите внимание, что вызов любого метода.getXXX вызывает исключение (эти вызовы переводятся в соответствующий вызов методов LazyDataSource.getXXX... и выглядит так, что LazyDataSource имеет значение null). ЭТОГО НЕ происходит, когда я отправляю запросы через клиент Java. Происходит только когда я использую SOAPUI для запроса @WebService (targetNamespace = " http://webservice.dcca.dell.com/", portName = "ObjectMTOMService", serviceName = "ObjectMTOMServiceService") открытый класс ObjectMTOMServiceImpl реализует ObjectMTOMService {
@Resource
WebServiceContext wsContext;
public ObjectStoreResp uploadObject(ObjectStoreReq objectReqParam) {
DataHandler objHandler = objectReqParam.getObjData();
try {
if (objHandler != null)
{
String objName=objHandler.getName();
String contentType=objHandler.getContentType();
InputStream iStream= objHandler.getDataSource().getInputStream();
}
catch (Exception e) {
e.printStackTrace();
respParam.setRespCode(-1);
return (respParam);
}
}
Я вижу следующее исключение
java.lang.NullPointerException
at org.apache.cxf.attachment.LazyDataSource.getName(LazyDataSource.java:73)
at javax.activation.DataHandler.getName(DataHandler.java:191)
at com.dell.dcca.webservice.objectmtomservice.ObjectMTOMServiceImpl.uploadObject(ObjectMTOMServiceImpl.java:98)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
........ <<< removed lot of stack trace for brevity >>>
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1555)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
java.lang.NullPointerException
Сообщение, которое отправляет SOAPUI, выглядит следующим образом: << Я приблизил это - копирование и вставка из журнала SOAPUI >>
POST https://160.110.73.35:8443/ObjectMTOMService/services/ObjectMTOMService HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: multipart/related; type="application/xop+xml"; start="<rootpart@soapui.org>"; start-info="text/xml"; boundary="----=_Part_13_756617.1389959552144"
SOAPAction: "http://InteropBaseAddress/interop/header"
MIME-Version: 1.0
Content-Length: 5432
Host: 160.110.73.35:8443
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
------=_Part_13_756617.1389959552144"
"Content-Type: application/octet-stream; name=InfantHealthcare.jpg"
Content-Transfer-Encoding: binary
Content-ID: <images.jpg>
Content-Disposition: attachment; name="images.jpg"; filename="InfantHealthcare.jpg
<< file contents ... >>
Любые входы приветствуются. Если кто-нибудь пробовал MTOM с клиентом SOAPui и комбинацией Axis 2.7.X и выше, дайте мне знать
Большое спасибо за вашу помощь
Yogesh
1 ответ
Эта проблема была из-за того, что я использовал неправильную настройку в SOAPUI, который отправлял данные как пустые. Я рассматриваю это как ошибку CXF, которая дает исключение Null Pointer. Должен быть более безопасный способ сообщить, что у меня нулевое вложение. В любом случае, вопрос в том, как я это исправил.
Приведенная ниже ссылка действительно дает информацию, но ИМХО это немного двусмысленно (или, может быть, я не правильно ее истолковал:-( - пришлось ее много раз читать
http://www.soapui.org/SOAP-and-WSDL/adding-headers-and-attachments.html
Мой неправильный способ указать SOAP-сообщение запроса в SOAP UI было
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:typ="http://webservice.dcca.dell.com/types">
<soapenv:Header/>
<soapenv:Body>
<typ:objectStoreReq>
<typ:ObjData>cid:183942097334</typ:ObjData>
<typ:objMetadata>
<typ:objName>img</typ:objName>
<typ:organizationName>Dell</typ:organizationName>
</typ:objMetadata>
</typ:objectStoreReq>
</soapenv:Body>
</soapenv:Envelope>
Правильный путь (обратите внимание, что вместо заполнения идентификатора детали в элементе "Objdata" с использованием "cid: id", который отправляет его в кодировке base64, мы должны указать элемент XOP Include, ссылающийся на вторую часть Mime, используя href).
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:typ="http://webservice.dcca.dell.com/types">
<soapenv:Header/>
<soapenv:Body>
<typ:objectStoreReq>
<typ:ObjData>
<inc:Include
href="cid:myImage.jpg"
xmlns:inc="http://www.w3.org/2004/08/xop/include"
/>
</typ:ObjData>
<typ:objMetadata>
<typ:objName>img</typ:objName>
<typ:organizationName>Dell</typ:organizationName>
</typ:objMetadata>
</typ:objectStoreReq>
</soapenv:Body>
</soapenv:Envelope>
С этим мои сообщения SOAP-UI были очень приятны для моего сервиса:-)