簡體   English   中英

編組時如何防止 JAXB 綁定 @XmlRootElement 的超類方法?

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

我有一個 class 用@XmlAccessorType(XmlAccessType.NONE)注釋為@XmlRootElement 我遇到的問題是超類的方法正在被綁定,當我不希望它們被綁定時,並且無法更新 class。 我希望有一個注釋可以放在根元素 class 上,以防止這種情況發生。

例子:

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Person extends NamedObject {

    @XmlElement
    public String getId() { ... }

}

我希望只有在Person上注釋@XmlElement的方法會被綁定和編組,但是超類的方法也都被綁定了。 生成的 XML 信息過多。

如何防止超類的方法被綁定而不必注釋超類本身?

根據這個 StackOverflow 帖子: 如何忽略超類?

JAX-B 不可能在不修改超類的情況下忽略超類。 引用該帖子的相關部分:

Update2:我在 java.net 上找到了一個類似問題的線程 該線程產生了一個增強請求,該請求被標記為另一個問題的副本,這導致了@XmlTransient 注釋。 對這些錯誤報告的評論讓我相信這在當前規范中是不可能的。

只需添加

@XmlAccessorType(XmlAccessType.NONE)

在每個超類聲明(以及 class 本身)之前。

在你的情況下:

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

請記住,這必須為每個超類真正完成,在處理巨大的 class 依賴樹時經常被遺忘。

接口當然不需要任何 JAXB 注釋。

我知道這個問題已經很老了,但是如果你的超類與其子類在同一個 package 中,那么有一種解決方案可以工作。

在 package 中創建一個package-info.java info.java 並插入

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

顯然,它在 package 中的所有類上設置了 XmlAccessType.NONE。 我自己,我在我們的域 model 中的每個 package 中都使用它。 因此,我很安全。 但是,如果您的 class 是“遙不可及”,如果它在 JDK 中,請使用[JAX-B] 如何忽略超類中接受的答案中的解決方案? .

我希望它對任何像我一樣偶然發現這個問題的人都有幫助。

我面臨着完全相同的問題。 我的超類不處理任何 JAXB 注釋(它不必),我希望我的子類在編組時不包含超類屬性。

在超類上添加 XmlAccesorType 不是解決方案,因為我無法修改超類。

還有其他解決方案嗎?

我找到了一個解決方案,但根據您想要做什么,它可能對您不起作用,是覆蓋您想要忽略的吸氣劑並讓它們返回null JAXB 規范和擴展的實現,忽略包含 null 值的字段。 請注意,如果您仍然需要能夠使用子類訪問超類值本身,您可能需要添加一個不是 getter 的輔助訪問器方法並相應地調整您的代碼。

MOXy替換您的 JAX-B 實現,您可以做任何您想做的事情。 它有大量的擴展,go 超出普通 JAX-B,其中一個允許您忽略繼承的屬性等。它還支持將 JAX-B 注釋移動到 XML 映射文件,因此您可以保留多組映射.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM