1

私は MOXy 2.5.0 を実行していて、 で を取得していClassCastExceptionますXmlAdapterが、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 の両方で正常に機能します (JSON ロジックには Jackson を使用していました)。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 が aRecordを として処理しようとしている理由はわかりませんRecordListが、それが起こっているように見えます。私が言ったように、これは JAXB のリファレンス (すなわち Sun) 実装では起こりません。MOXy を使用しようとしているときにのみ発生します。

ここに何かアイデアはありますか?ありがとう。

4

2 に答える 2

0

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。

MOXy と、あなたが使用している他の技術との違いの 1 つは、MOXy がRecordListとを実装するものとして扱うことListWrapperです。コレクション内のアイテムにのみ適用できるため、そのようなものは適用できません。java.util.Listjava.util.ListXmlAdapter

于 2013-11-11T17:10:24.180 に答える
0

Jackson を削除すると、JSON の書き込みアダプターがなくなります。JSON を生成する方法をサーバーに伝える必要があります。

于 2013-11-08T16:21:45.063 に答える