users@jersey.java.net

RE: [Jersey] Jaxb cdata

From: saturon <netbeans_at_vtxfree.ch>
Date: Fri, 26 Jun 2009 10:27:23 +0200

Thanks Paul, that's a good start.

So now I am in my MessageBodyWriter and should list all the different
methods from the different converters..
Since all converters are in the same namespace I actually have no way of
distinguishing method names. So I would need to do a big if-else branch
checking the actual types and set the respective cdata elements... Hmm:

Optimal would be of course to annotate / define what to print as cdata
at the converter level.
Otherwise is there no way to say print all String types as CDATA ?

public void writeTo(CDATASupport data,
            Class<?> type, Type genericType, Annotation[] annotations,
            MediaType mediaType, MultivaluedMap<String, Object> headers,
            OutputStream out) throws IOException {
        try {
            JAXBContext jc = JAXBContext.newInstance(data.getClass());
            Marshaller marshaller = jc.createMarshaller();
 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.FALSE);
            // get an Apache XMLSerializer configured to generate CDATA
            XMLSerializer serializer = getXMLSerializer(out,data);

    private XMLSerializer getXMLSerializer(OutputStream out,CDATASupport
data) {
        // configure an OutputFormat to handle CDATA
        OutputFormat of = new OutputFormat();
        // how to distinguish what to write as cdata ?
        if ( data instanceof MyConverter ) {
        of.setCDataElements(new String[]{"^name"});
      }
      ....


@Tatu: Yes if the reader does this. However I am dealing with some
legacy J2ME clients that do not do this..

-----Original Message-----
From: Paul.Sandoz_at_Sun.COM [mailto:Paul.Sandoz_at_Sun.COM]
Sent: Donnerstag, 25. Juni 2009 18:52
To: users_at_jersey.dev.java.net
Subject: Re: [Jersey] Jaxb cdata



On Jun 25, 2009, at 6:49 PM, Paul Sandoz wrote:

> Hi,
>
> It is not currently possible to support this with the existing JAXB
> providers i.e. it is not possible to define a content handler that
> the JAXB beans are serialized to, or to declare the CDATA with the
> JAXB bean.
>
> But it looks like you are defining your own JAXB supported
> providers. So... why don't you define that each convertor implement
> a common interface or is annotated with a common annotation. Then
> write one MessageBodyWriter supporting that interface or annotation.
> The CDATA mapping can be defined by the common interface or the
> annotation.
>

Alternatively, if you cannot modify those convert classes support a
wrapping type e.g.

   public class ConvertorWrapper<T> {
      // Store CDATA + Convertor
   }

and implement a message body writer for ConvertorWrapper.

Paul.

> Paul.
>
> On Jun 25, 2009, at 6:36 PM, saturon wrote:
>
>> Hi there,
>>
>> I now come to a problem i already had 1.5 years back and then
>> solved with a workaround. Now after 1.5 years I wonder if there are
>> any better solutions.
>>
>> My stack:
>> Jersey 1.01/Glassfish 2.1
>>
>> To develop: NB 6.1 with jersey plugin
>>
>> REST services serve xml, which partly contains xml-illegal
>> characters. Therefore I need to produce xml elemements with cdata
>> tags.
>>
>> I have jaxb annotated converters that wrap my entity beans.
>>
>> So how do you do that best?
>>
>> My solution 1.5 years back was to write MessageBodyWriter for every
>> Converter involved. In the MessageBodyWriter I configured the
>> serializer with the specifc cdata OutputFormat, actually using the
>> depreciated org.apache.xml.serialize.XMLSerializer and
>> org.apache.xml.serialize.OutputFormat.
>>
>> Something like:
>>
>> @Produces("application/xml")
>> @Provider
>> public class MyConverterWriter implements
>> MessageBodyWriter<MyConverter> {
>> ..
>> private XMLSerializer getXMLSerializer(OutputStream out) {
>> // configure an OutputFormat to handle CDATA
>> OutputFormat of = new OutputFormat();
>>
>> of.setCDataElements(new String[]{"^desc", "^log"});
>>
>> XMLSerializer serializer = new XMLSerializer(of);
>> serializer.setOutputByteStream(out);
>>
>> return serializer;
>> }
>> ..
>>
>>
>> As you see not very elegant, verbose ( I have now something like 35
>> Converters which I would need to write MessageBodyWriter for .,),
>> and also error prone to forget things.
>>
>> Is there any better solution for this problem?
>> Can't be that I am the only one and that JAXB did not foresee such
>> a thing?
>>
>>
>> Thanks, Ben
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
For additional commands, e-mail: users-help_at_jersey.dev.java.net