1

プロパティのセットがあり、単一のプロパティの各値は、スカラー (文字列、整数など) またはスカラーのコレクション (コレクション、コレクションなど) です。例として役立つ XML ドキュメントを次に示します。

<properties xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:java="http://java.oracle.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <property name="test#1" xsi:type="xs:int">1</property>
    <property name="test#2" xsi:type="java:int[]">
        <value xsi:type="xs:int">1</value>
        <value xsi:type="xs:int">2</value>
        <value xsi:type="xs:int">3</value>
    <value xsi:type="xs:int">4</value>
    </property>
</properties>

これは私が使用したいクラスですが、この構造を使用して生成するために値フィールドに正しくタグを付ける方法がわかりません。これには、スカラーまたはスカラーのリストの形式で、プロパティ要素の解析済みコンテンツが含まれている必要があります。データ型は属性値として存在します。

@XmlRootElement(name = "property")
public class Property {

    @XmlAttribute(name = "name")
    protected String name;
    @???
    protected Object value;
}

2 つのフィールドprotected Object scalarとを使用するとprotected List<Object> list、1 つは でタグ付けされ@XmlValue、もう 1 つは でタグ付けされますが、機能して@XmlElement(name = "value")いません。

誰にもアイデアはありますか?

更新 1

Property以下のようにタグ付けしました。

@XmlRootElement(name = "property")
public class Property {

    @XmlAttribute(name = "name")
    protected String name;
    @XmlJavaTypeAdapter(Test2Adapter.class)
    @XmlPath(".")
    protected Object value;
}

次の Adapter クラスを部分的に実装しました

public class Test2Adapter extends XmlAdapter<AdaptedValue, Object> {

@Override
public Object unmarshal(AdaptedValue v) throws Exception {
    if (v instanceof Scalar) {
    return ((Scalar) v).value;
    }
    if (v instanceof Complex) {
        return ((Complex) v).value;
    }
    return null;
}

@Override
public AdaptedValue marshal(Object v) throws Exception {
    if (v instanceof String) {
    Scalar s = new Scalar();
    s.value = v;

    return s;
    }
if (v instanceof Collection) {
    Complex c = new Complex();
    c.value = (Collection<? extends Object>) v;

    return c;
}
return null;
}

適応値:

@XmlSeeAlso({ Scalar.class, Complex.class })
public abstract class AdaptedValue {
}

スカラー:

public class Scalar extends AdaptedValue {

    @XmlValue
    public Object value;

}

複雑 :

public class Complex extends AdaptedValue {

    @XmlAttribute(name = "xsi:type")
    public String type;

    @XmlElement(name = "value")
    public Collection<? extends Object> value   
}

すべてが正しくマーシャリングされていますが、アンマーシャリングは機能しません。次の例外が発生します。

javax.xml.bind.UnmarshalException
 - with linked exception:
[Exception [EclipseLink-43] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345):
org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Missing class for indicator field value [xs:string] of type[class java.lang.String].
Descriptor:
XMLDescriptor(com.materna.osgi.service.cm.rest.resource.representation.Test2Adapter$AdaptedValue --> [])]
at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:190)
4

1 に答える 1