簡體   English   中英

JAXB“在此上下文中也不知道其任何超類”,避免使用@XmlSeeAlso

[英]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

  1. 創建一個自定義內容(注釋,處理方法等),以將特定字段/方法標記為“上下文”
  2. 加載字段/方法數據以提取數據類型
  3. 確保您不加載重復項並檢查無限遞歸的可能性

現在,我使用了一些緩存來幫助自己提高效率。 我還為我的根對象創建了一個稍微復雜的設置,該設置實際上是自己跟蹤類數據並使其非常快速。 我還創建了一個替代方法,將類標記為“ contextual”,我使用程序包檢查通過注釋加載該類,並且僅將其自動添加到上下文中,但尚未檢查效率。 對於第三次實施,我有一些想法,但我想完成更多的基准測試。

暫無
暫無

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

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