首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XmlAdapter和JSON的MOXy异常

XmlAdapter和JSON的MOXy异常
EN

Stack Overflow用户
提问于 2013-11-09 00:19:50
回答 2查看 709关注 0票数 1

我运行的是JSON2.5.0,并获得了一个带有XmlAdapterClassCastException,但只有在尝试输出XmlAdapter时才能正常工作。

我有一个包装类,看起来像这样:

代码语言:javascript
复制
@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 ...
}

该类的子类如下所示:

代码语言:javascript
复制
@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,如下所示:

代码语言:javascript
复制
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这样的成员,并这样声明它们:

代码语言:javascript
复制
@XmlRootElement(name = "container")
@XmlAccessorType(XmlAccessType.NONE)
public class Container
{
    @XmlElement
    @XmlJavaTypeAdapter(RecordListAdapter.class)
    protected RecordList recordList;

    // ... other stuff ...
}

使用参考JAXB实现,这在XML和JSON中都可以很好地工作(我们将Jackson用于JSON逻辑)。通过更改MOXy (并删除JSON ),在请求JSON输出时,我将得到类似以下内容的异常跟踪。

代码语言:javascript
复制
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时才会发生这种情况。

这里有什么想法吗?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2013-11-09 00:21:45

删除Jackson之后,您将不再拥有用于JSON的写入适配器。您需要告诉服务器应该如何生成JSON。

票数 0
EN

Stack Overflow用户

发布于 2013-11-12 01:10:24

注意:我是的负责人,也是专家组的成员。

MOXy与您正在使用的其他技术之间的一个不同之处在于,MOXy将RecordListListWrapper视为java.util.List,因为它实现了java.util.List。这样的XmlAdapter不能应用于它,因为它只能应用于集合中的项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19863781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档