xml传输错误

gpnt7bae  于 2021-06-29  发布在  Java
关注(0)|答案(0)|浏览(256)

使用多个线程调用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
        }

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题