[ 
https://issues.apache.org/jira/browse/CXF-4942?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13639598#comment-13639598
 ] 

Juan Carlos Román commented on CXF-4942:
----------------------------------------

Hi Aki... sorry for the delayed response.

The answer is yes CDataXMLStreamWriter is a part of the interceptor, here is 
the source:

{code:title=CdataWriterInterceptor.java}

package com.pagosonline.ppp4.banking.api.webservices.interceptors;

import java.io.OutputStream;
import javax.xml.stream.XMLStreamWriter;
import org.apache.cxf.interceptor.BareOutInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.staxutils.StaxUtils;

public class CdataWriterInterceptor extends AbstractPhaseInterceptor<Message> {

        public CdataWriterInterceptor() {

                super(Phase.WRITE);
                addBefore(BareOutInterceptor.class.getName());
        }

        @Override
        public void handleMessage(Message message) throws Fault {

                // disable the XML character encoding
                message.put("disable.outputstream.optimization", Boolean.TRUE);

                XMLStreamWriter writer = StaxUtils.createXMLStreamWriter(message
                                .getContent(OutputStream.class));
                message.setContent(XMLStreamWriter.class, new 
CDataXMLStreamWriter(writer));
        }

}
{code}

{code:title=CDataXMLStreamWriter.java}

package com.pagosonline.ppp4.banking.api.webservices.interceptors;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import org.apache.cxf.staxutils.DelegatingXMLStreamWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CDataXMLStreamWriter extends DelegatingXMLStreamWriter {

        /** The logger class */
        private static final Logger LOGGER = 
LoggerFactory.getLogger(CDataXMLStreamWriter.class);


        public CDataXMLStreamWriter(XMLStreamWriter del) {

                super(del);
        }

        @Override
        public void writeCharacters(String text) throws XMLStreamException {

                boolean useCData = checkIfCDATAneeded(text);
                if (useCData) {
                        LOGGER.info("WritingCData" + text);
                        super.writeCData(text);
                }
                else {
                        super.writeCharacters(text);
                }
        }

        private boolean checkIfCDATAneeded(String text) {

                if (text.contains("<")) {
                        return true;
                }

                return false;
        }

        public void writeStartElement(String prefix, String local, String uri)
                        throws XMLStreamException {

                super.writeStartElement(prefix, local, uri);
        }

}
{code}

Basically this code envelops the outbound message in a CDATA tag (I found this 
source on the web, I don't know if there are a better way...).

Unfortunately I can't reproduce this error because appears very occasionally. I 
attach the WSDL file and the sample message... hope that helps.

Thanks,

Juan




                
> XMLStreamException outbound message
> -----------------------------------
>
>                 Key: CXF-4942
>                 URL: https://issues.apache.org/jira/browse/CXF-4942
>             Project: CXF
>          Issue Type: Bug
>          Components: Soap Binding
>    Affects Versions: 2.7.0
>         Environment: cxf 2.7.0
> rehl 6
> tomcat 7
>            Reporter: Juan Carlos Román
>            Priority: Critical
>              Labels: XMLStreamException
>
> Hi,
> We build a webservice using CXF (2.7.0) that basically works with messages 
> with a CDATA attribute...
> Recently we review the system's log and we encountered the following 
> stacktrace:
> {code:xml}
> 2013-03-12 12:49:09,445 banking-api [1] INFO 
> [com.pagosonline.ppp4.banking.api.webservices.gtech.impl.GTechServiceImpl] - 
> rawResponse: <pagoResponse>
>    <peticionId>3769927</peticionId>
>    <codigoRespuesta>0000</codigoRespuesta>
>    <codigoConvenio>3</codigoConvenio>
>    <referenciaPago>3460120</referenciaPago>
>    <valorFactura>00000000010928000</valorFactura>
>    <fechaEfectiva>2013/03/12</fechaEfectiva>
>    <numeroAutorizacion>15694</numeroAutorizacion>
> </pagoResponse>
> 2013-03-12 12:49:09,445 banking-api [1] INFO 
> [com.pagosonline.ppp4.banking.api.webservices.interceptors.CDataXMLStreamWriter]
>  - WritingCData<pagoResponse>
>    <peticionId>3769927</peticionId>
>    <codigoRespuesta>0000</codigoRespuesta>
>    <codigoConvenio>3</codigoConvenio>
>    <referenciaPago>3460120</referenciaPago>
>    <valorFactura>00000000010928000</valorFactura>
>    <fechaEfectiva>2013/03/12</fechaEfectiva>
>    <numeroAutorizacion>15694</numeroAutorizacion>
> </pagoResponse>
> 2013-03-12 12:49:09,447 banking-api [1] WARNING 
> [org.apache.cxf.phase.PhaseInterceptorChain] - Interceptor for 
> {http://impl.gtech.webservices.api.banking.ppp4.pagosonline.com/}gtechService#{http://pagosonline.com}pagar
>  has thrown exception, unwinding now; Caused by: 
> org.apache.cxf.interceptor.Fault: Could not send Message.
>       at 
> org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
>       at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
>       at 
> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77)
>       at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
>       at 
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
>       at 
> org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:238)
>       at 
> org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:222)
>       at 
> org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:202)
>       at 
> org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137)
>       at 
> org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158)
>       at 
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:239)
>       at 
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:159)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
>       at 
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:215)
>       at 
> org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:547)
>       at 
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1359)
>       at 
> org.openspaces.pu.container.jee.stats.RequestStatisticsFilter.doFilter(RequestStatisticsFilter.java:58)
>       at 
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1330)
>       at 
> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:478)
>       at 
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
>       at 
> org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520)
>       at 
> org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
>       at 
> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:941)
>       at 
> org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:409)
>       at 
> org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186)
>       at 
> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:875)
>       at 
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
>       at 
> org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
>       at 
> org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
>       at 
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
>       at org.eclipse.jetty.server.Server.handle(Server.java:349)
>       at 
> org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441)
>       at 
> org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:936)
>       at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:801)
>       at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:224)
>       at 
> org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:51)
>       at 
> org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)
>       at 
> org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)
>       at 
> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
>       at 
> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
>       at java.lang.Thread.run(Thread.java:662)
> Caused by: org.eclipse.jetty.io.EofException
>       at 
> org.eclipse.jetty.http.HttpGenerator.flushBuffer(HttpGenerator.java:921)
>       at org.eclipse.jetty.http.HttpGenerator.complete(HttpGenerator.java:814)
>       at 
> org.eclipse.jetty.server.HttpConnection.commitResponse(HttpConnection.java:572)
>       at 
> org.eclipse.jetty.server.HttpConnection$Output.close(HttpConnection.java:993)
>       at 
> org.apache.cxf.transport.http.AbstractHTTPDestination$WrappedOutputStream.close(AbstractHTTPDestination.java:725)
>       at 
> org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
>       at 
> org.apache.cxf.transport.http.AbstractHTTPDestination$BackChannelConduit.close(AbstractHTTPDestination.java:655)
>       at 
> org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
>       ... 40 more
> Caused by: java.nio.channels.ClosedChannelException
>       at 
> sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:135)
>       at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:357)
>       at java.nio.channels.SocketChannel.write(SocketChannel.java:360)
>       at 
> org.eclipse.jetty.io.nio.ChannelEndPoint.gatheringFlush(ChannelEndPoint.java:354)
>       at 
> org.eclipse.jetty.io.nio.ChannelEndPoint.flush(ChannelEndPoint.java:292)
>       at 
> org.eclipse.jetty.io.nio.SelectChannelEndPoint.flush(SelectChannelEndPoint.java:300)
>       at 
> org.eclipse.jetty.http.HttpGenerator.flushBuffer(HttpGenerator.java:848)
>       ... 47 more
> 2013-03-12 12:49:09,448 banking-api [1] WARNING 
> [org.apache.cxf.phase.PhaseInterceptorChain] - Interceptor for 
> {http://impl.gtech.webservices.api.banking.ppp4.pagosonline.com/}gtechService#{http://pagosonline.com}pagar
>  has thrown exception, unwinding now; Caused by: 
> org.apache.cxf.binding.soap.SoapFault: Error writing to XMLStreamWriter.
>       at 
> org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor$SoapOutEndingInterceptor.handleMessage(SoapOutInterceptor.java:288)
>       at 
> org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor$SoapOutEndingInterceptor.handleMessage(SoapOutInterceptor.java:270)
>       at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
>       at 
> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:112)
>       at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:331)
>       at 
> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77)
>       at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
>       at 
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
>       at 
> org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:238)
>       at 
> org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:222)
>       at 
> org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:202)
>       at 
> org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137)
>       at 
> org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158)
>       at 
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:239)
>       at 
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:159)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
>       at 
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:215)
>       at 
> org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:547)
>       at 
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1359)
>       at 
> org.openspaces.pu.container.jee.stats.RequestStatisticsFilter.doFilter(RequestStatisticsFilter.java:58)
>       at 
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1330)
>       at 
> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:478)
>       at 
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
>       at 
> org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520)
>       at 
> org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
>       at 
> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:941)
>       at 
> org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:409)
>       at 
> org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186)
>       at 
> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:875)
>       at 
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
>       at 
> org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
>       at 
> org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
>       at 
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
>       at org.eclipse.jetty.server.Server.handle(Server.java:349)
>       at 
> org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441)
>       at 
> org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:936)
>       at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:801)
>       at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:224)
>       at 
> org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:51)
>       at 
> org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)
>       at 
> org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)
>       at 
> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
>       at 
> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
>       at java.lang.Thread.run(Thread.java:662)
> Caused by: javax.xml.stream.XMLStreamException: No open start element, when 
> trying to write end element
>       at 
> com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:1522)
>       at 
> com.ctc.wstx.sw.BaseStreamWriter.reportNwfStructure(BaseStreamWriter.java:1551)
>       at 
> com.ctc.wstx.sw.BaseNsStreamWriter.doWriteEndTag(BaseNsStreamWriter.java:648)
>       at 
> com.ctc.wstx.sw.BaseNsStreamWriter.writeEndElement(BaseNsStreamWriter.java:280)
>       at 
> org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor$SoapOutEndingInterceptor.handleMessage(SoapOutInterceptor.java:279)
>       ... 43 more
> {code}
> This message caught our attention:
> {code:java}
> Caused by: javax.xml.stream.XMLStreamException: No open start element, when 
> trying to write end element
> {code}
> (The response message don't have any special char)
> But after investigating we didn't found anything related... :(
> You have any idea about this behavior ? 
> Thanks in advance,
> --
> Juan

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to