14

How do I remove the class=”Something ” attributes in Xstream .

I use Xstream with annotations

Quintin Par
  • 15,862
  • 27
  • 93
  • 146

5 Answers5

22

I read its code and found if your class is not mapper.defaultImplementationOf(fieldType) , it will add the default class attribute for you, unless the class attribute name is null;

So, set this can remove the class=”Something ” attributes

 xstream.aliasSystemAttribute(null, "class");
Bleastrind
  • 221
  • 2
  • 2
14

Indeed the problem is not as clearly phrased as it should. My guess is that you are using a non-standard collection or using a field of an interface type for which XStream needs to store the actual class.

In the second case you can just use alias:

xstream.alias("field name", Interface.class, ActualClassToUse.class);

See http://markmail.org/message/gds63p3dnhpy3ef2 for more details.

Christopher Oezbek
  • 23,994
  • 6
  • 61
  • 85
  • I had a similar problem and this turned out to be the problem. I was worried that I would have to use alias javacode instead of annotations, but they turned out to complement eachother nicely as I can determine the actual class to use at runtime. – Caoilte May 10 '10 at 09:56
  • Is there a spring oxm alternative available for this? – Vombat Jun 05 '17 at 15:47
2

Use something of this sort to remove the class attribute completely rather than aliasing it with something else:

private String generateResponse(final XStream xStream)
{
    StringWriter writer = new StringWriter();
    xStream.marshal(this, new PrettyPrintWriter(writer) {
        @Override
        public void addAttribute(final String key, final String value)
        {
            if (!key.equals("class"))
            {
                super.addAttribute(key, value);
            }
        }
    });
    return writer.toString();
}
sth
  • 222,467
  • 53
  • 283
  • 367
MiKu
  • 385
  • 1
  • 5
  • 16
2

This attribute is shown, at least, when it's not obvious which class shall be used. Usage of interface is an example. In situations like that You can try:

xStream.addDefaultImplementation(YourDefaultImplementation.class, YourInterface.class);

.

kcpr
  • 1,055
  • 1
  • 12
  • 28
1

Can you give some example output? I think this usually happens when using Collections. Without seeing the output, my best guess is that you need to register aliases:

xstream.alias("blog", Blog.class);

See http://x-stream.github.io/alias-tutorial.html for more in-depth coverage. Again, paste in some sample output.

facundofarias
  • 2,973
  • 28
  • 27
Dave
  • 13,518
  • 7
  • 42
  • 51