How do I prevent JAXB from binding superclass methods of the @XmlRootElement when marshalling?

10,976

Solution 1

According to this StackOverflow post: How can I ignore a superclass?

It is not possible with JAX-B to ignore the superclass without modifying the superclass. Quoting the relevant portion of that post:

Update2: I found a thread on java.net for a similar problem. That thread resulted in an enhancement request, which was marked as a duplicate of another issue, which resulted in the @XmlTransient annotation. The comments on these bug reports lead me to believe this is impossible in the current spec.

Solution 2

Just add

@XmlAccessorType(XmlAccessType.NONE)

in front of EACH superclass declaration (and the class itself).

In your case:

@XmlAccessorType(XmlAccessType.NONE)
class NamedObject{
    [ ... ]
}

Remember that this has to be done really for each superclass, it is often forgotten when dealing with huge class dependency trees.

Interfaces, of course, don't need any JAXB annotations.

Solution 3

I know this question is quite old, but there is a kind of solution which works if your superclass is in the same package as its child.

Create a package-info.java in your package and insert

@XmlAccessorType(XmlAccessType.NONE)
package my.package.with.classes;

Obviously, it sets XmlAccessType.NONE upon all classes in the package. Myself, I use it in every package in our domain model. Therefore, I'm pretty safe. However, if your class is 'out of reach', f.e. it's in the JDK, use the solution from the accepted answer in [JAX-B] How can I ignore a superclass?.

I hope it's helpful for anynone who stumbles upon this question as I did.

Share:
10,976
Matt
Author by

Matt

Love them codes.

Updated on July 19, 2022

Comments

  • Matt
    Matt almost 2 years

    I have a class that is annotated as the @XmlRootElement with @XmlAccessorType(XmlAccessType.NONE). The problem that I am having is that the superclass's methods are being bound, when I do not want them to be bound, and cannot update the class. I am hoping there is an annotation that I can put on the root element class to prevent this from happening.

    Example:

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.NONE)
    public class Person extends NamedObject {
    
        @XmlElement
        public String getId() { ... }
    
    }
    

    I would expect that only the methods annotated @XmlElement on Person would be bound and marshalled, but the superclass's methods are all being bound, as well. The resulting XML then has too much information.

    How do I prevent the superclass's methods from being bound without having to annotate the superclass, itself?

  • Matt
    Matt over 15 years
    I wanted to avoid having to go into the superclasses, but I have also come to this conclusion. Thanks for the answer.
  • benvolioT
    benvolioT over 13 years
    Added links from the quoted portion of the referenced SO issue.