Uploaded image for project: 'CXF'
  1. CXF
  2. CXF-2749

org.apache.cxf.configuration.spring.JAXBBeanFactory cannot handle elements with namespace prefixes

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Cannot Reproduce
    • 2.2.6
    • Invalid
    • Configuration, Transports
    • Only when used with Sun StAX implementation 1.4.2; does not seem to happen with Woodstox

    Description

      I first noticed this when attempting to define the http:conduit element in a Spring config file:

      <beans:beans xmlns:http="http://cxf.apache.org/transports/http/configuration"
      xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
      ">

      <http:conduit name="*.http-conduit">
      <http:client ConnectionTimeout="30000" ReceiveTimeout="120000" />
      </http:conduit>

      </beans:beans>

      It always fails with the following exception:

      Caused by: javax.xml.bind.UnmarshalException

      • with linked exception:
        [javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,198]
        Message: http://www.w3.org/TR/1999/REC-xml-names-19990114#ElementPrefixUnbound?http&http:client]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:426)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:362)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:339)
        at org.apache.cxf.configuration.spring.JAXBBeanFactory.createJAXBBean(JAXBBeanFactory.java:51)
        ... 124 more
        Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,198]
        Message: http://www.w3.org/TR/1999/REC-xml-names-19990114#ElementPrefixUnbound?http&http:client
        at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:593)
        at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:160)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:360)
        ... 126 more

      Looking at the source code, it appears that CXF is sending the body contents of http:conduit verbatim to JAXBBeanFactory for parsing into a JAXB object. Apparently, Woodstox doesn't care if there is an unregistered namespace prefix, but the Sun StAX implementation does and throws the exception.

      My current workaround is to define the http:conduit element in a separate XML file and use it as the default namespace like this:

      <beans:beans xmlns="http://cxf.apache.org/transports/http/configuration"
      xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
      ">

      <conduit name="*.http-conduit">
      <client ConnectionTimeout="30000" ReceiveTimeout="120000" />
      </conduit>

      </beans:beans>

      Attachments

        Activity

          People

            dkulp Daniel Kulp
            fiddlerpianist@yahoo.com Jonathan Whitall
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: