Hi,

by upgrading to TomEE 9.1.0 we have a lot of message exception stack about a 
missing property: jakarta.xml.bind.PropertyException: name: 
com.sun.xml.bind.characterEscapeHandler value: null. [1]

By using the debugger I come to following conlusion:

In the lib org.apache.cxf.common.jaxb (org.apache.tomee:cxf-shade:9.1.0) the 
method org.apache.cxf.common.jaxb.DataWriterImpl.createMarshaller will be 
invoked which creates a marshaller from the context which is on my machine: 
jar:file:/opt/tomee/lib/jaxb-runtime-3.0.2.jar!/org/glassfish/jaxb/runtime/v2/runtime/JAXBContextImpl.class.

Then the JAXBUtils.setEscapeHandler will be invoked 
databinding.applyEscapeHandler(!noEscape, eh -> 
JAXBUtils.setEscapeHandler(marshaller, eh)); which is in the same jar.

The invoked methodd adds a com.sun.xml package namespace... (which I assume is 
wrong). [2]

After this in the lib org.glassfish.jaxb:jaxb-runtime:3.0.2 the method 
org.glassfish.jaxb.runtime.v2.runtime.MarshallerImpl.setProperty will be 
invoked.
The constant name is protected static final String ENCODING_HANDLER = 
"org.glassfish.jaxb.characterEscapeHandler";.
My assumption is that here a match should happen. [3]

At the end it runs into the method 
jakarta.xml.bind.helpers.AbstractMarshallerImpl.setProperty of 
org.apache.tomee:jakartaee-api:9.1.1. The end of the process the 
PropertyException will be thrown (throw new PropertyException(name, value);)

Can you confirm that this is a bug?
If the name would be correct a null value is not an correct value, so another 
exception will be thrown where I am not sure if I have any influence on it ( 
databinding.applyEscapeHandler(!noEscape, eh -> 
JAXBUtils.setEscapeHandler(marshaller, eh));).[2][3]

Thanks,
Markus



[1]
20-Jul-2023 11:22:16.142 INFO [http-nio-8080-exec-1] 
org.apache.cxf.jaxb.io.DataReaderImpl.createUnmarshaller PropertyException 
setting Marshaller properties
    jakarta.xml.bind.PropertyException: name: org.glassfish.jaxb.ObjectFactory 
value: jakarta.xml.bind.JAXBElementFactory@6bc54824
        at 
jakarta.xml.bind.helpers.AbstractUnmarshallerImpl.setProperty(AbstractUnmarshallerImpl.java:327)
        at 
org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallerImpl.setProperty(UnmarshallerImpl.java:474)
        at 
org.apache.cxf.jaxb.io.DataReaderImpl.createUnmarshaller(DataReaderImpl.java:123)
        at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:166)
        at 
org.apache.cxf.wsdl.interceptors.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:109)
        at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
        at 
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
        at 
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:265)
        at 
org.apache.openejb.server.cxf.CxfWsContainer.onMessage(CxfWsContainer.java:85)
        at 
org.apache.openejb.server.webservices.WsServlet.service(WsServlet.java:72)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
        at 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
        at org.apache.openejb.server.httpd.EEFilter.doFilter(EEFilter.java:67)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
        at 
io.smallrye.metrics.jaxrs.JaxRsMetricsServletFilter.doFilter(JaxRsMetricsServletFilter.java:53)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
        at 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at 
org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
        at 
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
        at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:356)
        at 
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
        at 
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at 
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:870)
        at 
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1762)
        at 
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at 
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at 
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at 
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.base/java.lang.Thread.run(Thread.java:833)
20-Jul-2023 11:22:16.401 INFO [http-nio-8080-exec-1] 
org.apache.cxf.common.jaxb.JAXBUtils.setEscapeHandler Failed to set 
MinumEscapeHandler to jaxb marshaller
    jakarta.xml.bind.PropertyException: name: 
com.sun.xml.bind.characterEscapeHandler value: null
        at 
jakarta.xml.bind.helpers.AbstractMarshallerImpl.setProperty(AbstractMarshallerImpl.java:343)
        at 
org.glassfish.jaxb.runtime.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:499)
        at 
org.apache.cxf.common.jaxb.JAXBUtils.setEscapeHandler(JAXBUtils.java:1135)
        at 
org.apache.cxf.jaxb.io.DataWriterImpl.lambda$createMarshaller$0(DataWriterImpl.java:140)
        at 
org.apache.cxf.jaxb.JAXBDataBinding.applyEscapeHandler(JAXBDataBinding.java:279)
        at 
org.apache.cxf.jaxb.io.DataWriterImpl.createMarshaller(DataWriterImpl.java:140)
        at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:239)
        at 
org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:137)
        at 
org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)
        at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
        at 
org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:90)
        at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
        at 
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
        at 
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:265)
        at 
org.apache.openejb.server.cxf.CxfWsContainer.onMessage(CxfWsContainer.java:85)
        at 
org.apache.openejb.server.webservices.WsServlet.service(WsServlet.java:72)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
        at 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
        at org.apache.openejb.server.httpd.EEFilter.doFilter(EEFilter.java:67)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
        at 
io.smallrye.metrics.jaxrs.JaxRsMetricsServletFilter.doFilter(JaxRsMetricsServletFilter.java:53)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
        at 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at 
org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
        at 
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
        at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:356)
        at 
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
        at 
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at 
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:870)
        at 
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1762)
        at 
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at 
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at 
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at 
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.base/java.lang.Thread.run(Thread.java:833)

[2]
   public static void 
org.apache.cxf.common.jaxb.JAXBUtils.setEscapeHandler(Marshaller marshaller, 
Object escapeHandler) {
        try {
            String postFix = getPostfix(marshaller.getClass());
            if (postFix != null && escapeHandler != null) {
                marshaller.setProperty("com.sun.xml" + postFix + 
".bind.characterEscapeHandler", escapeHandler);
            }
        } catch (PropertyException e) {
            LOG.log(Level.INFO, "Failed to set MinumEscapeHandler to jaxb 
marshaller", e);
        }
    }


[3]
        if( ENCODING_HANDLER.equals(name) || ENCODING_HANDLER2.equals(name)) {
            if(!(value instanceof CharacterEscapeHandler))
                throw new PropertyException(
                    Messages.MUST_BE_X.format(
                            name,
                            CharacterEscapeHandler.class.getName(),
                            value.getClass().getName() ) );
            escapeHandler = (CharacterEscapeHandler)value;
            return;
        }

Reply via email to