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

后端 未结 6 1816
谎友^
谎友^ 2020-12-30 09:10

I have a class that is annotated as the @XmlRootElement with @XmlAccessorType(XmlAccessType.NONE). The problem that I am having is that the superc

相关标签:
6条回答
  • 2020-12-30 09:45

    A solution I have found, but which might not work for you depending on what you want to do, is to override the getters you want to ignore and let them return null. The JAXB specs, and by extension the implementations, ignore fields that contain a null value. Note that if you still need to be able to access the superclass value itself using the subclass, you may need to add a secondary accessor method that is not a getter and adjust your code accordingly.

    0 讨论(0)
  • 2020-12-30 09:55

    Replace your JAX-B implementation with MOXy and you can do anything you want. It has a ton of extensions that go above and beyond normal JAX-B, one of which will allow you to ignore inherited properties, etc. It also supports moving JAX-B annotations to an XML mapping file so you can keep multiple sets of mappings.

    0 讨论(0)
  • 2020-12-30 09:58

    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.

    0 讨论(0)
  • 2020-12-30 09:59

    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.

    0 讨论(0)
  • 2020-12-30 10:04

    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.

    0 讨论(0)
  • 2020-12-30 10:12

    I'm facing the exact same problem. My superclass does not handle any JAXB annotations (it doesn't have to) and I would like my subclass not to include superclass properties while marshalling.

    Adding the XmlAccesorType on superclass cannot be the solution as I have no way to modify the superclass.

    Is there any other solution?

    0 讨论(0)
提交回复
热议问题