You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Sergey Beryozkin (Resolved) (JIRA)" <ji...@apache.org> on 2011/12/02 23:41:41 UTC

[jira] [Resolved] (CXF-3946) causes exception due to immutable Map being used in JAXBElementProvider

     [ https://issues.apache.org/jira/browse/CXF-3946?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Sergey Beryozkin resolved CXF-3946.
-----------------------------------

       Resolution: Fixed
    Fix Version/s: 2.5.1
                   2.4.5
         Assignee: Sergey Beryozkin
    
> <property name="namespacePrefixes" ref="namespaceMap" /> causes exception due to immutable Map being used in JAXBElementProvider
> --------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CXF-3946
>                 URL: https://issues.apache.org/jira/browse/CXF-3946
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-RS, JAXB Databinding
>    Affects Versions: 2.5
>            Reporter: Miguel Martins Feitosa Jr.
>            Assignee: Sergey Beryozkin
>            Priority: Trivial
>             Fix For: 2.4.5, 2.5.1
>
>
>  I was trying to set a specific namespace prefix for a qualified REST xml.
> I configured beans.xml and included package-info.java as below:
> @javax.xml.bind.annotation.XmlSchema(    namespace=GoldenKey.NS,
>                                         elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
>                                         attributeFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
>                                         xmlns={@javax.xml.bind.annotation.XmlNs(prefix = GoldenKey.NS_QUALIFIER , namespaceURI=GoldenKey.NS)}
>                                      )
> package com.upmc.tdc.xml;
> beans.xml snippets:
>      <jaxrs:server id="goldenKey_rest" address="/rest">
>        <jaxrs:serviceBeans>
>          <ref bean="goldenKey_bean" />
>        </jaxrs:serviceBeans>
>         <jaxrs:extensionMappings>
>             <entry key="json" value="application/json" />
>             <entry key="xml" value="application/xml" />
>         </jaxrs:extensionMappings>
>          <jaxrs:providers>
>           <ref bean="dateProvider" />
>           <ref bean="exceptionMapper" />
>           <ref bean="jaxbProvider" />
>         </jaxrs:providers>
>      </jaxrs:server>
>     
>      <jaxws:endpoint serviceName="GoldenKey" endpointName="GoldenKeyPort" id="goldenKey_soap" implementor="#goldenKey_bean" address="/soap">
>         <jaxws:binding>
>             <soap:soapBinding version="1.2" />
>         </jaxws:binding>
>         <jaxws:features>
>             <bean class="org.apache.cxf.feature.LoggingFeature">
>                 <property name="prettyLogging" value="true" />
>             </bean>
>         </jaxws:features>
>     </jaxws:endpoint>
>      <bean id="goldenKey_bean" class="com.upmc.tdc.server.GoldenKeyImpl"/>
>      <bean id="dateProvider" class="com.upmc.tdc.server.parameterhandler.DateParameterHandler"/>
>      <bean id="exceptionMapper" class="com.upmc.tdc.exception.ExceptionMapper"/>
>     
>      <bean id="jaxbProvider" class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
>         <property name="marshallerProperties" ref="propertiesMap" />
>          <property name="namespacePrefixes" ref="namespaceMap" />
>         <property name="enableBuffering" value="true" />
>     </bean>
>    
>      <util:map id="propertiesMap">
>         <entry key="jaxb.formatted.output">
>             <value type="java.lang.Boolean">true</value>
>             <!--  prints indented XML for REST, useful for testing, can be disabled for production -->
>         </entry>
>     </util:map>
>    
>     <util:map id="namespaceMap">
>         <entry key="http://server.tdc.upmc.com/"  value="GoldenKey"/>
>     </util:map>
> This setup throws the following exception:
> java.lang.UnsupportedOperationException
>     at java.util.AbstractMap.put(AbstractMap.java:203)
>     at java.util.AbstractMap.putAll(AbstractMap.java:273)
>     at org.apache.cxf.jaxrs.provider.JAXBElementProvider.marshalCollectionMember(JAXBElementProvider.java:327)
>     at org.apache.cxf.jaxrs.provider.JAXBElementProvider.marshalCollection(JAXBElementProvider.java:293)
>     at org.apache.cxf.jaxrs.provider.JAXBElementProvider.writeTo(JAXBElementProvider.java:232)
>     at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:257)
>     at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.processResponse(JAXRSOutInterceptor.java:144)
>     at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleMessage(JAXRSOutInterceptor.java:83)
>     at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
> <clipped>
> Lines 325-330 of JAXBElementProvider.java contain the following code:
>         if (ns.length() > 0) {
>             Map<String, String> map = Collections.singletonMap(ns, "ns1");
>             map.putAll(nsPrefixes);
>             setNamespaceMapper(ms, map);
>         }
>         marshal(obj, cls, genericType, enc, os, mt, ms);
> The call Collections.singletonMap(...) is below:
>  /**
>      * Returns an immutable map, mapping only the specified key to the
>      * specified value.  The returned map is serializable.
>      *
>      * @param key the sole key to be stored in the returned map.
>      * @param value the value to which the returned map maps <tt>key</tt>.
>      * @return an immutable map containing only the specified key-value
>      *         mapping.
>      * @since 1.3
>      */
>     public static <K,V> Map<K,V> singletonMap(K key, V value) {
>         return new SingletonMap<>(key, value);
>     }
> So it seems that
>             map.putAll(nsPrefixes);
> should fail as it is failing when called because the map is immutable.
> In case there are other prefixes to add it seems that the map should be of another type....

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira