Hi,

Cool, I will do the same since changing CXF version now is probably not
feasible for us now.

Thanks
--- Karen

On Tue, Jul 21, 2009 at 3:08 PM, Sergey Beryozkin <[email protected]
> wrote:

>
> Hi,
>
> No problems and thanks for raising this issue on this list -  I reckon
> we've
> ended up adding a pretty useful feature (optional JAXBElement wrapping) to
> the default JAXBElementProvider wich can be generally useful.
>
> By the way, that workaround I mentioned is a bit hacky though doable - but
> a
> simpler workaround would be to create a custom JAXBElementProvider which
> extends the default one and overrides
>
> protected void marshal(Object obj, Class<?> cls, Type genericType,
>                           String enc, OutputStream os, MediaType mt)
>
> the way it's done currently on the trunk, perhaps explicitly checking for
> BaseType
>
>
> cheers, Sergey
>
> Qzpmwo wrote:
> >
> > Hi Sergey,
> >
> > I'm really impressed with your help!
> >
> > Thanks a lot
> > --- Alex
> >
> > On Tue, Jul 21, 2009 at 12:36 PM, Sergey Beryozkin <
> > [email protected]> wrote:
> >
> >>
> >> Hi
> >>
> >> OK, it's done now on the trunk/2.2.3-SNAPSHOT. Hopefully a 2.2.3 release
> >> will be done next week.
> >> You'd just need to explicitly register JAXBElementProvider and set a
> list
> >> property with a list of class names whose instances need to be wrapped
> >> prior
> >> to serialization, here's a fragment :
> >>
> >> <beans  xmlns:util="http://www.springframework.org/schema/util";
> >>  xsi:schemaLocation="http://www.springframework.org/schema/beans
> >> http://www.springframework.org/schema/beans/spring-beans.xsd
> >> http://www.springframework.org/schema/util
> >> http://www.springframework.org/schema/util/spring-util-2.0.xsd ...">
> >>
> >> <util:list id="jaxbElementClassNames">
> >> <value>org.apache.cxf.systest.jaxrs.BaseType</value>
> >> </util:list>
> >>
> >> <jaxrs:server>
> >>  <jaxrs:providers>
> >>      <ref bean="jaxbProvider"/>
> >>  <jaxrs:providers>
> >> </jaxrs:server>
> >>
> >> <bean id="jaxbProvider"
> >> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
> >> <property name="jaxbElementClassNames" ref="jaxbElementClassNames"/>
> >> </bean>
> >> </beans>
> >>
> >> In meantime, till the release is done, you can register a response JAXRS
> >> filter and wrap the BaseType instance in JAXBElement, it is a bit hacky,
> >> but
> >> you can do something like
> >>
> >> public class JAXBElementWrapper implements ResponseHandler {
> >>    private final static Method m;
> >>    static {
> >>       m = SomeClass.getMethod("get", new Class[0]);
> >>    }
> >>
> >>
> >>    public Response handleResponse(Message m, OperationResourceInfo ori,
> >> Response response) {
> >>
> >>        if (BaseType.class == ori.getMethodToInvoke().getReturnType()) {
> >>            // this is a hacky bit
> >>            OperationResourceInfo ori2 = new OperationResourceInfo(m,
> >> ori.getAnnotatedMethod(), ori.getClassResourceInfo());
> >>            message.getExchange().put(OperationResourceInfo.class, ori2);
> >>            Object instance =
> >> MessageContentsList.getContentsList(message).get(0);
> >>            // convert as Wolfgang suggested or check JAXBElementProvider
> >> source
> >>            JAXBElement el = convertToJAXBElement(instance);
> >>            message.setContent(new MessageContentsList(el));
> >>        }
> >>        return null;
> >>    }
> >>
> >>    private static class SomeClass {
> >>        public JAXBElement<BaseType> get();
> >>    }
> >> }
> >>
> >>
> >> Also, Wolfgang suggested some additional schema updates - not sure if it
> >> will work for you
> >>
> >> thanks, Sergey
> >>
> >>
> >> Qzpmwo wrote:
> >> >
> >> > Hi,
> >> >
> >> > I'm having a strange problem with CXF RESTful service marsahlling base
> >> and
> >> > derived xsd types.
> >> >
> >> > XSD:
> >> >
> >> > <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema";
> >> >     xmlns:jaxb="http://java.sun.com/xml/ns/jaxb";
> >> >     xmlns="http://www.cisco.com/dms/xml/ns/dsmCommonService";
> >> >     targetNamespace="http://www.cisco.com/dms/xml/ns/dsmCommonService
> "
> >> >     elementFormDefault="unqualified" jaxb:version="2.0">
> >> >
> >> >    <xs:complexType name="BaseType">
> >> >       <xs:sequence>
> >> >       </xs:sequence>
> >> >    </xs:complexType>
> >> >
> >> >    <xs:complexType name="DerivedType">
> >> >       <xs:complexContent>
> >> >          <xs:extension base="BaseType">
> >> >             <xs:sequence>
> >> >             </xs:sequence>
> >> >          </xs:extension>
> >> >      </xs:complexContent>
> >> >    </xs:complexType>
> >> >
> >> >    <xs:complexType name="ListType">
> >> >       <xs:sequence>
> >> >                <xs:element name="item" type="BaseType" minOccurs="0"
> >> > maxOccurs="unbounded" />
> >> >       </xs:sequence>
> >> >    </xs:complexType>
> >> >
> >> >    <xs:element name="base" type="BaseType" />
> >> >    <xs:element name="derived" type="DerivedType" />
> >> >    <xs:element name="list" type="ListType" />
> >> >
> >> > </xs:schema>
> >> >
> >> > xjc has been used to jenerate java code from xsd. After that:
> >> >
> >> > 1)  @XmlSeeAlso pointing to DerivedType class and @XmlRootElement
> >> > annotations have been added to BaseType java class code
> >> > 2) @XmlRootElement has been added to DerivedType java class code
> >> > 3) @XmlRootElement has been added to ListType java class code
> >> >
> >> > When my CXF rest service returns list of the Derived objects it
> >> produces
> >> > xml
> >> > correctly:
> >> >
> >> > <list>
> >> >     <base xsi:type="DerivedType">...</base>
> >> >     ...
> >> >     <base xsi:type="DerivedType">...</base>
> >> > </list>
> >> >
> >> > But when I'm requesting 1 instance of the Derived object XML is wrong
> >> (as
> >> > I
> >> > understand)
> >> >
> >> > <derived>...</derived>
> >> >
> >> > Since I did not specify substitution group in my opinion xml should be
> >> > like
> >> > in list:
> >> >
> >> > <base xsi:type="DerivedType">...</base>
> >> >
> >> > Could you please clarify the issue for me and may be help me to solve
> >> this
> >> > problem.
> >> >
> >> > Forgot to mention that I'm using CXF 2.2
> >> >
> >> > Thanks in advance
> >> > --- Karen
> >> >
> >> >
> >>
> >> --
> >> View this message in context:
> >>
> http://www.nabble.com/Possible-problem-with-JAXB-marshalling-tp24549727p24591197.html
> >> Sent from the cxf-user mailing list archive at Nabble.com.
> >>
> >>
> >
> >
>
> --
> View this message in context:
> http://www.nabble.com/Possible-problem-with-JAXB-marshalling-tp24549727p24593397.html
> Sent from the cxf-user mailing list archive at Nabble.com.
>
>

Reply via email to