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 были очень приятны для моего сервиса:-)

Другие вопросы по тегам