[英]JAXB Issue — class … nor any of its super class is known to this context
[英]JAXB “nor any of its super class is known to this context” avoid @XmlSeeAlso
目前,我正在使用JAX-RS,並讓JAXB綁定自動為我在JEE6項目中處理將數據轉換為XML和JSON的過程。 直到我嘗試創建一個通用的響應對象來包裝我所有的信息之前,一切工作都異常完美。
當我嘗試使用通用響應類com.eln00b.Wrapper
(其中包含private Object result
屬性)時,我得到:
javax.xml.bind.MarshalException-具有鏈接的異常:[com.sun.istack.SAXException2:類com.eln00b.CustomObject或其任何超類對此上下文都是已知的。 javax.xml.bind.JAXBException:com.eln00b.CustomObject類或其任何超類對此上下文都是已知的。
所以我添加到com.eln00b.Wrapper
:
@XmlSeeAlso ({com.eln00b.CustomObject})
public class Wrapper {
}
一切正常。
我希望這是非常通用的。 我不想牛逼不斷添加類的@XmlSeeAlso
上標注com.eln00b.Wrapper
類。 我如何讓系統自動為JAXB上下文定位我的所有類?
即使是在黑客中使用了Reflections之類的東西來加載數據,也沒關系。 我只是不確定如何在沒有@XmlSeeAlso
批注的情況下獲取上下文以加載所有數據。 我將使用大量注釋來創建它,但是根本無法使用。
它只是通過添加數據來手動工作,就像手動轉換一樣。 不過,我不希望使用手動XML / JSON的創建,除非我絕對需要(我不想處理內容協商或類似的東西)。
樣品:
JAXBContext.newInstance(new Class[] {Wrapper.class, CustomObject.class});
因此,自定義解析器的本質如下所示:
@Provider
@Produces ({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public class JaxbContextResolver implements ContextResolver<JAXBContext> {
@Override
public JAXBContext getContext(Class<?> type) {
// load appropriate context data
Class[] bindTypes = ...
// create
try {
return JAXBContext.newInstance(bindTypes);
} catch (JAXBException e) {
// todo: this can be handled better but works for the example
throw new RuntimeException(e);
}
}
}
現在,“ 加載適當的上下文數據 ”的處理非常簡單。 通過使用運行時數據基本上模仿@XmlSeeAlso
:
現在,我使用了一些緩存來幫助自己提高效率。 我還為我的根對象創建了一個稍微復雜的設置,該設置實際上是自己跟蹤類數據並使其非常快速。 我還創建了一個替代方法,將類標記為“ contextual”,我使用程序包檢查通過注釋加載該類,並且僅將其自動添加到上下文中,但尚未檢查效率。 對於第三次實施,我有一些想法,但我想完成更多的基准測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.