簡體   English   中英

XmlAdapter和JSON的MOXy異常

[英]MOXy exception with XmlAdapter and JSON

我運行莫西2.5.0和得到一個ClassCastExceptionXmlAdapter ,而只是試圖輸出JSON時; XML輸出工作正常。

我有一個包裝器類,如下所示:

@XmlAccessorType(XmlAccessType.NONE)
public abstract class ListWrapper<T> implements List<T>
{
    private List<T> list = new ArrayList<T>();

    @XmlElement
    private Foo foo;  // stuff specific to my problem domain

    public ListWrapper()
    {
    }

    public ListWrapper(Foo foo, List list)
    {
        this.foo = foo;
        this.list = list;
    }

    // ... implementation of List<T> using the list member ...
}

該類的后代如下所示:

@XmlRootElement(name = "recordList")
@XmlAccessorType(XmlAccessType.NONE)
public class RecordList extends ListWrapper<Record>
{
    public RecordList()
    {
        super();
    }

    public RecordList(Foo foo, List<Record> list)
    {
        super(foo, list);
    }

    @Override
    @XmlElementWrapper(name = "records")
    @XmlElement(name = "record", type = Record.class)
    public List<Record> getList()
    {
        return super.getList();
    }
}

然后有一個RecordList的XmlAdapter看起來像這樣:

public class RecordListAdapter extends XmlAdapter<RecordList, RecordList>
{
    @Override
    public RecordList unmarshal(RecordList v) throws Exception
    {
        return v;
    }

    @Override
    public RecordList marshal(RecordList v) throws Exception
    {
        return v;
    }
}

最后是一個包含RecordList類的成員的類,並按如下方式聲明它們:

@XmlRootElement(name = "container")
@XmlAccessorType(XmlAccessType.NONE)
public class Container
{
    @XmlElement
    @XmlJavaTypeAdapter(RecordListAdapter.class)
    protected RecordList recordList;

    // ... other stuff ...
}

使用參考JAXB實現,在XML和JSON中都可以正常工作(我們將Jackson用作JSON邏輯)。 更改MOXy(並刪除Jackson)后,在請求JSON輸出時,將獲得類似於以下內容的異常跟蹤。

javax.xml.bind.MarshalException - with linked exception:[Exception [EclipseLink-25003] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: An error occurred marshalling the object
Internal Exception: Exception [EclipseLink-3001] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.ConversionException
Exception Description: The object [1], of class [class com.example.Record], could not be converted to [class com.example.RecordList].
Internal Exception: java.lang.ClassCastException: com.example.Record cannot be cast to com.example.RecordList]
    at org.eclipse.persistence.jaxb.JAXBMarshaller.marshal(JAXBMarshaller.java:403)
...
Caused by: Exception [EclipseLink-25003] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: An error occurred marshalling the object
Internal Exception: Exception [EclipseLink-3001] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.ConversionException
Exception Description: The object [1], of class [class com.example.Record], could not be converted to [class com.example.RecordList].
Internal Exception: java.lang.ClassCastException: com.example.Record cannot be cast to com.example.RecordList
    at org.eclipse.persistence.exceptions.XMLMarshalException.marshalException(XMLMarshalException.java:97)
...
Caused by: Exception [EclipseLink-3001] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.ConversionException
Exception Description: The object [1], of class [class com.example.Record], could not be converted to [class com.example.RecordList].
Internal Exception: java.lang.ClassCastException: com.example.Record cannot be cast to com.example.RecordList
    at org.eclipse.persistence.exceptions.ConversionException.couldNotBeConverted(ConversionException.java:87)
...
Caused by: java.lang.ClassCastException: com.example.Record cannot be cast to com.example.RecordList
    at com.example.RecordListAdapter.marshal(RecordListAdapter.java:5)
    at org.eclipse.persistence.internal.jaxb.XMLJavaTypeConverter.convertObjectValueToDataValue(XMLJavaTypeConverter.java:172)

我不知道為什么MOXy試圖將Record用作RecordList ,但是似乎就在發生這種情況。 就像我說的那樣,JAXB的引用(即Sun)實現不會發生這種情況。 它僅在我嘗試使用MOXy時發生。

這里有什么想法嗎? 謝謝。

刪除Jackson后,您將不再具有JSON的寫適配器。 您需要告訴服務器它應該如何產生JSON。

注意:我是EclipseLink JAXB(MOXy)的負責人,並且是JAXB(JSR-222)專家組的成員。

莫西和您正在使用其他技術之間的一個區別是,莫西將把RecordListListWrapper作為java.util.List ,因為它實現了java.util.List 因此,不能將XmlAdapter應用於它,因為它只能應用於集合中的項目。

暫無
暫無

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

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