1

私は @XmlIDREFリファレンスアプローチを試しています。注釈は次のとおりです。

 /**
   * getter for Attribute/List<Attribute> attributes
   * @return attributes
   */
  @XmlElementWrapper(name="attributes")
  @XmlElements({
    @XmlElement(name="Attribute", type=AttributeJaxbDao.class)
  })
  @XmlIDREF
  public List<Attribute> getAttributes() { 

これはエラーメッセージにつながります:

javax.xml.bind.JAXBException: 
Exception Description: Since the property or field [attributes] is set as XmlIDREF, the target type of each XmlElement declared within the XmlElements list must have an XmlID property.  Please ensure the target type of XmlElement [Attribute] contains an XmlID property.
 - with linked exception:
[Exception [EclipseLink-50035] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.JAXBException
Exception Description: Since the property or field [attributes] is set as XmlIDREF, the target type of each XmlElement declared within the XmlElements list must have an XmlID property.  Please ensure the target type of XmlElement [Attribute] contains an XmlID property.]
    at org.eclipse.persistence.jaxb.JAXBContext$TypeMappingInfoInput.createContextState(JAXBContext.java:832)
    at org.eclipse.persistence.jaxb.JAXBContext.<init>(JAXBContext.java:143)

AttributeJaxbDao注釈がありますが:

 /**
   * getter for xsd:string/String id
   * @return id
   */
  @XmlAttribute(name="id")  
  @XmlID
  public String getId() { 

「標準的な使用法」には2つの違いがあります@XmlIDREF/ @XmlID

  1. AttributeJaxbDaoは派生クラスです-アノテーションはスーパークラスにあります
  2. 属性はインターフェースです-タイプは、@XmlElementアノテーションでAttributeJaxbDao.classと具体的に指定されています

この状況でエラーが表示されるのはなぜですか?これに対する回避策はありますか?インターフェイスと一般化を使用しないように強制されることを避けたいと思います。

4

1 に答える 1

2

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

残念ながら、このユースケースが正しく機能しないという2つのバグがありました。

これらのバグは、EclipseLink2.4.2および2.5.0ストリームで修正されています。これらのストリームは現在開発中です。ナイトリービルドは次のリンクからダウンロードできます(2013年2月22日以降)。


完全な例

以下は、すべてが正しく機能することを示すために使用する質問で与えられたモデルよりも少し複雑なモデルです。

Foo

このFooクラスには、タイプの2つのプロパティがList<Attribute>ありAttribute、インターフェイスです。両方に注釈が付けられており、具体的なタイプを指定する注釈@XmlElementsが含まれています。プロパティにも。@XmlElementの注釈が付けられています。attributeRefs@XmlIDREF

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Foo {

    @XmlElementWrapper(name="Attributes")
    @XmlElements({
        @XmlElement(name="AttributeFoo", type=AttributeJaxbDao.class),
        @XmlElement(name="AttributeBar", type=AttributeJaxbDao2.class)
      })
    List<Attribute> attributes = new ArrayList<Attribute>();;


    @XmlElementWrapper(name="AttributeRefs")
    @XmlElements({
      @XmlElement(name="AttributeRefFoo", type=AttributeJaxbDao.class),
      @XmlElement(name="AttributeRefBar", type=AttributeJaxbDao2.class)
    })
    @XmlIDREF
    List<Attribute> attributeRefs = new ArrayList<Attribute>();

}

属性

Attribute非常にシンプルなインターフェースです。

public interface Attribute {

}

AttributeJaxbDao

これは、注釈によって活用されるAttribute注釈付きのフィールドを含むの実装です。@XmlID@XmlIDREF

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class AttributeJaxbDao implements Attribute {

    @XmlAttribute(name="id")  
    @XmlID
    String id;

    String name;

}

AttributeJaxbDao2

Attributeこれは、。で注釈が付けられたフィールドを持つ実装でもあり@XmlIDます。

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class AttributeJaxbDao2 implements Attribute {

    @XmlAttribute(name="id")  
    @XmlID
    String id;

    String name;

}

デモ

以下は、すべてが機能することを証明するために実行できるデモコードです。

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum14921547/input.xml");
        Foo foo = (Foo) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}

input.xml / Output

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<foo>
    <Attributes>
        <AttributeFoo id="a">
            <name>A</name>
        </AttributeFoo>
        <AttributeBar id="b">
            <name>B</name>
        </AttributeBar>
        <AttributeFoo id="c">
            <name>C</name>
        </AttributeFoo>
    </Attributes>
    <AttributeRefs>
        <AttributeRefFoo>a</AttributeRefFoo>
        <AttributeRefBar>b</AttributeRefBar>
        <AttributeRefFoo>c</AttributeRefFoo>
    </AttributeRefs>
</foo>
于 2013-02-18T12:17:48.553 に答える