Я столкнулся с ошибкой при попытке вызвать службу SOAP.В нашем приложении OSGi Bundle (работает на AEM - JDK 1.8) пытается использовать веб-службу SOAP.Заглушки были созданы с использованием Apache CXF 3.3.1.При обращении к службе SOAP я получил исключение Null Pointer.Вот журнал ошибок, который мы видим:
com.sun.xml.internal.ws.fault.ServerSOAPFaultException: Client received SOAP Fault from server: java.lang.NullPointerException Please see the server log to find more detail regarding exact cause of the failure.
at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(Unknown Source)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(Unknown Source)
at com.sun.xml.internal.ws.client.sei.StubHandler.readResponse(Unknown Source)
at com.sun.xml.internal.ws.db.DatabindingImpl.deserializeResponse(Unknown Source)
at com.sun.xml.internal.ws.db.DatabindingImpl.deserializeResponse(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(Unknown Source)
at com.sun.proxy.$Proxy274.processSearch(Unknown Source)
При просмотре журналов на стороне службы журнал, похоже, указывает на исключение нулевого указателя:
[5/30/19 16:42:27:953 EDT] 00017406 EndpointMetho E <Null Message>
java.lang.NullPointerException
at com.XXXX.edms.services.search.EDRSearchServiceSOAPImpl.processSearch(EDRSearchServiceSOAPImpl.java:69)
at sun.reflect.GeneratedMethodAccessor97.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at com.sun.xml.ws.api.server.InstanceResolver$1.invoke(InstanceResolver.java:246)
at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:146)
at com.sun.xml.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:257)
at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:93)
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:598)
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:557)
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:542)
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:439)
at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:243)
at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:471)
at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:244)
at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:135)
at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:129)
at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:160)
at com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:75)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:595)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1230)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:779)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:79)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:964)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1104)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:914)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:200)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:456)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:518)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:309)
at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:84)
at com.ibm.ws.ssl.channel.impl.SSLReadServiceContext$SSLReadCompletedCallback.complete(SSLReadServiceContext.java:1818)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1720)
ХотяУ меня нет прямого доступа к коду, но я получил информацию о том, что объект, выбрасывающий исключение нулевого указателя, является «metaDataList».Вот фрагмент кода, который отвечает за выполнение вызова SOAP:
SearchRequest request = getSearchRequest();
EDRSearchServiceSOAPImplService edrSearchServiceSOAPImplService = new EDRSearchServiceSOAPImplService();
EDRSearchServiceSOAPImpl edrSearchServiceSOAPImpl = edrSearchServiceSOAPImplService.getEDRSearchServiceSOAPImplPort();
SearchResponse searchResponse = edrSearchServiceSOAPImpl.processSearch(request, userCredentials);
System.out.println("response is====================="+searchResponse);
Метод getSearchRequest () выглядит следующим образом:
public SearchRequest getSearchRequest() {
DocumentLaunchSettings docLaunchSettings = new DocumentLaunchSettings();
SearchRequest searchRequest = new SearchRequest();
docLaunchSettings.setLauncher("dev_lom");
docLaunchSettings.setShowLink(true);
docLaunchSettings.setUseChronicleId(true);
DocumentACLSettings docACLSettings = new DocumentACLSettings();
docACLSettings.setReturnACL(true);
searchRequest.setDocbase("edmsdev");
searchRequest.setVersion("1.0");
searchRequest.setMaxNumberOfDocuments("1000");
//searchRequest.setObjectType("dm_document");
searchRequest.setObjectType("dm_document");
searchRequest.getFolderPaths().add("/");
//searchRequest.getFolderPaths().add("/eLibrary/Fleet and Remarketing");
searchRequest.setDocumentLaunchSettings(docLaunchSettings);
searchRequest.setDocumentACLSettings(docACLSettings);
String[] metaDataList = new String[] { "object_name", "r_object_id", "r_object_type" };
//String[] metaDataList = new String[] { "r_object_id" };
searchRequest.getMetaDataList().addAll(Arrays.asList(metaDataList));
List<LogicalOp> logicalOpList = searchRequest.getSearchCriteria();
LogicalOp logicalOp = new LogicalOp();
logicalOp.setType("metadata");
logicalOp.setRelational("equals");
logicalOp.setLogical("and");
logicalOp.setName("i_chronicle_id");
logicalOp.setValue("0900cad9824ba5bf");
logicalOpList.add(logicalOp);
return searchRequest;
}
Однако в нашем коде мы сделалиуверен, что не осталось пустым.Вот как мы его устанавливаем, как видно из метода getSearchRequest ():
String[] metaDataList = new String[] { "object_name", "r_object_id", "r_object_type" };
Опять же, просто чтобы убедиться, что он не равен нулю, я отладил код, и после проверки я увиделобъект устанавливается соответствующим образом.Вот заглушка, сгенерированная для объекта SearchRequest:
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "searchRequest", propOrder = {
"metaDataList"
})
public class SearchRequest {
@XmlElement(required = true)
protected List<String> metaDataList;
public List<String> getMetaDataList() {
if (metaDataList == null) {
metaDataList = new ArrayList<String>();
}
return this.metaDataList;
}
public void setMetaDataList(List<String> metaDataList) {
this.metaDataList = metaDataList;
}
}
У него не было установщика для metaDataList, я добавил это, но я не вижу, чтобы это имело какое-либо значение.
Я также заметил, что в xsd тип задается как xs: string, а в коде тип - java.util.List.Я не знаю, может ли это быть причиной NullPointerException.
Интересно, что когда я пытаюсь использовать тот же фрагмент кода в автономном приложении Java, я вижу успешный вызов SOAP.Но только в AEM у меня возникла эта проблема.Я не знаю, что здесь отличается.
<xs:complexType name="searchRequest">
<xs:sequence>
<xs:element name="metaDataList" type="xs:string" maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:complexType>