使用多个线程调用soap web服务时,出现以下错误:
30-Dec-2020 15:52:51.937 SEVERE [http-nio-8080-exec-128] com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet caught throwable
javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: java.lang.NullPointerException
javax.xml.transform.TransformerException: java.lang.NullPointerException]
at com.sun.xml.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:322)
at com.sun.xml.ws.message.AbstractMessageImpl.writeTo(AbstractMessageImpl.java:142)
at com.sun.xml.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:108)
at com.sun.xml.ws.encoding.SOAPBindingCodec.encode(SOAPBindingCodec.java:258)
at com.sun.xml.ws.transport.http.HttpAdapter.encodePacket(HttpAdapter.java:320)
at com.sun.xml.ws.transport.http.HttpAdapter.access$100(HttpAdapter.java:93)
at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:454)
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:661)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.filters.ExpiresFilter.doFilter(ExpiresFilter.java:1232)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:83)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.brovada.nexexchange.MDCFilter.doFilter(MDCFilter.java:74)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: java.lang.NullPointerException
javax.xml.transform.TransformerException: java.lang.NullPointerException]
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:269)
at com.sun.xml.bind.v2.runtime.BridgeImpl.marshal(BridgeImpl.java:100)
at com.sun.xml.bind.api.Bridge.marshal(Bridge.java:141)
at com.sun.xml.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:315)
... 44 more
Caused by: com.sun.istack.SAXException2: java.lang.NullPointerException
javax.xml.transform.TransformerException: java.lang.NullPointerException
at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:246)
at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:261)
at com.sun.xml.bind.v2.runtime.XMLSerializer.writeDom(XMLSerializer.java:810)
at com.sun.xml.bind.v2.runtime.AnyTypeBeanInfo.serializeBody(AnyTypeBeanInfo.java:113)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:699)
at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:152)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:332)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:699)
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:264)
... 47 more
Caused by: javax.xml.transform.TransformerException: java.lang.NullPointerException
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:737)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:343)
at com.sun.xml.bind.v2.runtime.XMLSerializer.writeDom(XMLSerializer.java:808)
... 53 more
Caused by: java.lang.NullPointerException
当用一个线程调用同一个web服务时,我没有得到错误。
什么类型的并发问题会导致上述错误?
似乎错误发生在soap调用的jaxb过程中。通过stacktrace查看,错误发生在框架中,而不是我的代码中。
关于如何进一步缩小根本原因有什么建议吗?
谢谢大家,新年快乐。
编辑#1
从stacktrace可以看出,在进行soap调用时,在jaxb尝试对xml进行marshall/unmarshall的过程中发生了错误。下面是进行soap调用的代码:
javax.xml.soap.SOAPConnection soapConnection = null;
soapConnectionFactory
= javax.xml.soap.SOAPConnectionFactory.newInstance();
soapConnection = soapConnectionFactory.createConnection();
SOAPMessage soapResponse;
if (endpoint != null) {
soapResponse = soapConnection.call(soapMessage, endpoint);
}
else {
soapResponse = soapConnection.call(soapMessage, url);
}
正如我之前提到的,通过调试器跟踪这段代码没有任何帮助,因为我总是会得到一个合法的soapresponse和返回的数据,而不是nullpointerexception。
请注意,我的xml是用带有一些变量替换的字符串模板构建的,但不是用pojo和jaxb对它们进行编组。为什么我仍然看到对jaxb的调用?
谢谢,如果你需要更多的澄清请告诉我。
编辑#2
显示mdcfilter的代码-如您所见,mdc过滤器只是过滤器链中的一层。最终,它会生成我在edit#1中显示的客户机代码。我没有访问服务器代码的权限。
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class MDCFilter implements Filter {
...
/**
* Clears the mapped diagnostic context for the current request. If a
* tracker is found, it will be added to the MDC.
* @param pRequest The current request.
* @param pResponse The response.
* @param pFc The filter chain.
* @throws IOException Not thrown.
* @throws ServletException Not thrown.
*/
@Override
public void doFilter(
ServletRequest pRequest,
ServletResponse pResponse,
FilterChain pFc)
throws IOException,
ServletException {
MDC.clear();
HttpServletRequest r = (HttpServletRequest) pRequest;
String tracker = r.getHeader(CoreMessageHeaderEnum.TRACKER.getValue());
if ((tracker == null) || tracker.isEmpty()) {
tracker = r.getParameter(CoreMessageHeaderEnum.TRACKER.getValue());
}
if ((tracker == null) || tracker.isEmpty()) {
tracker = (String) r.getAttribute(CoreMessageHeaderEnum.TRACKER.getValue());
}
if (tracker != null) {
r.setAttribute(CoreMessageHeaderEnum.TRACKER.getValue(), tracker);
MDC.put(CoreMessageHeaderEnum.TRACKER.getValue(), tracker);
}
pFc.doFilter(pRequest, pResponse);
}
...
}
编辑#3
“1)如何在编辑#3列表中找到”
只是一个输入流,读取作为soap调用的一部分发送的xml。如前所述,xml是有效的,因为对于应用程序的单线程使用,我没有得到nullpointer。
InputStream is = new ByteArrayInputStream(requestXml.getBytes(StandardCharsets.UTF_8));
MessageFactory factory
= javax.xml.soap.MessageFactory.newInstance(javax.xml.soap.SOAPConstants.SOAP_1_2_PROTOCOL);
SOAPMessage soapMessage = factory.createMessage(null, is);
SOAPMessage soapResponse;
if (endpoint != null) {
soapResponse = soapConnection.call(soapMessage, endpoint);
}
else {
soapResponse = soapConnection.call(soapMessage, url);
}
if (soapResponse != null) {
response = convertResponseToString(soapResponse);
}
else {
LOG.warn("Response was null.");
}
“2)客户端代码的类是什么?它是一个servlet?在你发布的错误日志中似乎没有显示”
该类不是servlet,只是由groovy工作流触发的普通类。类别定义如下:
@ChsSingletonService
public class ServiceAPIImpl implements ServiceAPI {
...
@Override
public Message runService(final Message inputMsg) throws BrvException {
// calling the SOAP client code as per Edits above
}
...
}
其中serviceapi定义为:
package com.brovada.chs.serviceapi;
import com.brovada.commons.exception.BrvException;
import com.brovada.commons.message.Message;
public interface ServiceAPI {
Message runService(Message var1) throws BrvException;
}
注解@chssingletonservice定义为:
package com.brovada.chs.core.annotations;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ChsSingletonService {
}
触发java类的groovy工作流:
def exec(message) {
def (m, i) = serviceName.split(':')
moduleName = m
implementationName = i
serviceClassName = "com.brovada.chs.serviceapi.ServiceAPI"
methodName = "runService"
outputDocId = "INFORMATION"
execute message
}
暂无答案!
目前还没有任何答案,快来回答吧!