2012-01-04 6 views
2

私はXMLにPOJOをマッピングするためにJAXBのEclipseLinkの実装(2.3)を使用していますに抽象的な「ゲッター」をマッピングし、以下のユースケースで問題に遭遇:JAXB-のEclipseLink:XML​​

public abstract class A { 

    public abstract Set<X> getX(); 
    // There is no setter 
} 


public class B extends A { 

    // Set via constructor 
    private Set<X> x; 

    @Override 
    public Set<X> getX(); 

} 

私はマッピングを定義しています

<java-type name="foo.A" xml-transient="true"/> 

およびクラスBのために:

<java-type name="bar.B" xml-accessor-type="PROPERTY"> 
    <xml-root-element name="B" /> 
    <java-attributes> 
     <xml-element java-attribute="x" xml-path="..."/> 
    </java-attributes> 
</java-type> 
自体が完全に外部のバインディング・ファイルに、私は、クラスAはそうなどの過渡されるように設定します

さて、マーシャリング時に、私は例外を取得しています: 私の意見ではB.

によって継承され、Aにおける抽象宣言から来ている「重複するプロパティの名前[X]クラスは、[bar.B]で見つかりました」

Bのアクセサー型をFIELDに設定すると、このエラーが取り除かれます。残念ながら、これはオプションではありません。フィールドを返さないmarshalにはBの余分なプロパティがあります。 PROPERTY(次の作業:BのFIELDへのアクセサ型を設定し、余分なプロパティを@XmlPathアノテーションでマッピングする - しかし、私のコードではアノテーションは必要ありません)

は、クラスBのアクセッサ型PROPERTYで立ち往生している、私の次の試みでした:

Ignoring attribute [x] on class [bar.B] as no Property was generated for it. 

同じ:

<java-type name="foo.A" xml-accessor-type="NONE"/> 

が私を取得され、Bによって継承されることから、抽象プロパティを防ぐために

<java-type name="foo.A" xml-accessor-type="PROPERTY"> 
    <java-attributes> 
     <xml-transient java-attribute="x"/> 
    </java-attributes> 
</java-type> 

両方の場合、プロパティ 'x'は無視されます。

私は本当にこれで今かなりの時間を費やしています - これを動作させることができないと想像できませんか?現時点では

私の回避策:

は、一過性であることをfoo.Aを残して(問題なく私プロパティ「X」を取得します)bar.Bのアクセッサ型フィールドを指定して使用してBに余分なプロパティをマッピングコード内の注釈。 しかし、前にも触れましたが、私はこれをアノテーションなしで完全に解決したいと思います。ブレイズ? :)

に関して、

--qu

+0

私は現在あなたの問題を調査中です。すぐに回答を掲載します。 –

+0

素晴らしい!何らかの関連性:サブクラスがマーシャリングされているときに、スーパークラスのプロパティがデフォルトで「見えない」というデフォルトの動作ですか?私はちょうど冗長なサブクラスでそれらをオーバーライドする必要があることを経験しました... – quaylar

+0

あなたはバグ(https://bugs.eclipse.org/367886)にヒットしたようですが、私たちは現在修正を探しています。表示されているその他の問題の詳細については、http://blog.bdoughan.com/p/contact_01.html –

答えて

1

注:私はEclipseLink JAXB (MOXy)リードとJAXB 2 (JSR-222)専門家グループのメンバーです。

あなたはバグを起こしたようです。この問題に関する進捗状況は、次のリンクで追跡できます。私は、以下のこの問題に関する追加の詳細を提供しています


使用して注釈

あなたはJAXB/MOXY注釈をこのユースケースをマッピングするつもりだった場合、あなたは可能性Aクラスに@XmlAccessorType(XmlAccessType.NONE)を設定し、次のようにします。

package forum8727402; 

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.NONE) 
public abstract class A { 

    public abstract String getX(); 

} 

B

package forum8727402; 

import javax.xml.bind.annotation.*;  
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement 
public class B extends A { 

    @XmlPath("a/b/c/text()") 
    private String x; 

    public B() { 
     x = "Hello World"; 
    } 

    @Override 
    public String getX() { 
     return x; 
    } 

    @XmlElement 
    public String getCalculatedValue() { 
     return "Calculated Value"; 
    } 

} 

デモ

package forum8727402; 

import javax.xml.bind.*; 

public class Demo { 

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

     B b = new B(); 

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

} 
MOXYの外部マッピングは、以下

oxm.xml

トンを表しMOXy external mapping fileあるファイルを使用し

出力

<?xml version="1.0" encoding="UTF-8"?> 
<b> 
    <a> 
     <b> 
     <c>Hello World</c> 
     </b> 
    </a> 
    <calculatedValue>Calculated Value</calculatedValue> 
</b> 

以前に示された注釈の同等彼:

<?xml version="1.0" encoding="UTF-8"?> 
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    package-name="forum8727402"> 
    <java-types> 
     <java-type name="A" xml-accessor-type="NONE"/> 
     <java-type name="B"> 
      <xml-root-element/> 
      <java-attributes> 
       <xml-element java-attribute="x" xml-path="a/b/c/text()"/> 
       <xml-element java-attribute="calculatedValue"/> 
      </java-attributes> 
     </java-type> 
    </java-types> 
</xml-bindings> 

デモ

次のコードは、マッピングファイルを参照する方法を示しています

package forum8727402; 

import java.util.*; 
import javax.xml.bind.*;  
import org.eclipse.persistence.jaxb.JAXBContextFactory; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Map<String, Object> properties = new HashMap<String, Object>(1); 
     properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum8727402/oxm.xml"); 
     JAXBContext jc = JAXBContext.newInstance(new Class[] {A.class, B.class}, properties); 

     B b = new B(); 

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

} 

出力

[EL Warning]: 2012-01-04 14:45:46.366--Ignoring attribute [x] on class [forum8727402.xml.B] as no Property was generated for it. 
<?xml version="1.0" encoding="UTF-8"?> 
<b> 
    <calculatedValue>Calculated Value</calculatedValue> 
</b>