Question

I'am using the ToAttributedValueConverter via class annotation:

@XStreamConverter(value = ToAttributedValueConverter.class, strings = { "text" })
public final class Message {
    private final String text;

    // Needed for XStream serialization
    @SuppressWarnings("unused")
    private Message() {
        text = null;
    }

    public Message(final String text) {
        if (text == null) {
            throw new NullPointerException();
        }
        this.text = text;
    }

    public String getText() {
        return this.text;
    }
}

Example:

final XStream xstream = new XStream();
xstream.alias("message", Message.class);
xstream.processAnnotations(Message.class);

final Message message = new Message("Lorem Ipsum");
final String xml = xstream.toXML(message);
System.out.println(xml);

The output is:

<message>Lorem Ipsum</message>

In order to separate data model (class Message) from the persistence (XStream) I would remove all XStream annotations from the data model.

For example XStreamAlias("message") can simply replaced with xstream.alias("message", Message.class). But whats the replacement for ToAttributedValueConverter in a xstream object?

Was it helpful?

Solution

Sometimes the answer is quite simple. The short answer is: use xstream.registerConverter(converter)

The long answer is: ToAttributeValueConverter is a converter. That is, you can register that one with the XStream instance to influence the serialization.

The following code will do what you want in your question without using a XStream annotation (I used your Message class for that sample). All relevant code is in the main method:

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;

public class XmlSample {

    public static void main(String[] args) {
        XStream xStream = new XStream();
        Converter converter = new ToAttributedValueConverter(Message.class,
                xStream.getMapper(), xStream.getReflectionProvider(), xStream.getConverterLookup(), "text");
        xStream.registerConverter(converter);
        xStream.alias("message", Message.class);
        System.out.println(xStream.toXML(new Message("testtest")));
    }

    public static final class Message {
        private final String text;

        // Needed for XStream serialization
        @SuppressWarnings("unused")
        private Message() {
            text = null;
        }

        public Message(final String text) {
            if (text == null) {
                throw new NullPointerException();
            }
            this.text = text;
        }

        public String getText() {
            return this.text;
        }
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top