1

これは私が現実世界の問題として遭遇したものです。

以下のような授業があります。フィールド名の選択は私のものではありませんが、データベース内の実際のフィールド名によって決定されます(名前が変更されました)。

import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement(name = "JAXBAnnotatedClass1")
@XmlType(propOrder = { "A_DT", "B_DT" }) 

public class JAXBAnnotatedClass1
{
    private Date A_DT;
    private Date B_DT;

    @XmlJavaTypeAdapter(JaxbDateAdapter.class)  
    public Date getA_DT()
    {
        return A_DT;
    }

    public void setA_DT(Date a_DT)
    {
        A_DT = a_DT;
    }

    @XmlJavaTypeAdapter(JaxbDateAdapter.class)  
    public Date getB_DT()
    {
        return B_DT;
    }

    public void setB_DT(Date b_DT)
    {
        B_DT = b_DT;
    }
}

DateAdapterクラスはこの問題に関連しているとは思いません。

Eclipse Indigo Serviceリリースバージョン1を使用しています。このクラスからスキーマを生成しようとしましたが、次のエラーが発生しました-

Property a_DT is present but not specified in @XmlType.propOrder
    this problem is related to the following location:
        ....JAXBAnnotatedClass1.getA_DT()
        at com.cigna.framework.testing.JAXBAnnotatedClass1
Property b_DT is present but not specified in @XmlType.propOrder
    this problem is related to the following location:
                                  ....JAXBAnnotatedClass1.getB_DT()

ここでの奇妙なことは、次の変更を加えると、すべてが機能することです-

@XmlType(propOrder = { "a_DT", "b_DT" }) // changed first uppercase letter 
//to lowercase without changing field name   

もう1つの興味深い観察は、代わりにこれらのようなフィールド名(以下)があれば、すべてが機能することです!以下の場合の唯一の違いは、フィールド名のアンダースコアの前に、1文字ではなく2文字の大文字が含まれていることです。

@XmlRootElement(name = "JAXBAnnotatedClass2")
@XmlType(propOrder = { "AX_DT", "BX_DT" }) 
public class JAXBAnnotatedClass2
{
    private Date AX_DT;
    private Date BX_DT;

        // similar code... 

この問題の原因は何ですか?これを解決する方法はありますか?

4

3 に答える 3

2

最初に注意すべきことは、デフォルトでは、JAXB (JSR-222)実装はプライベート フィールドではなくパブリック プロパティを処理していることです。これは、JAXB がプロパティ名を参照するため、フィールドの名前は関係ないことを意味します (以下のコード サンプルを参照)。getA_DTJAXB は、プロパティ名 ( propertyに対応)の最初の文字を小文字にします (プロパティに対応するa_DT2 つの大文字が連続していない限り)。getAX_DTAX_DT

package forum12304863;

import javax.xml.bind.annotation.XmlType;

@XmlType(propOrder={"a_DT", "b_DT", "AX_DT", "BX_DT"})
public class Root {

    private String field1;
    private String field2;
    private String field3;
    private String field4;

    public String getA_DT() {
        return field1;
    }

    public void setA_DT(String a_DT) {
        field1 = a_DT;
    }

    public String getB_DT() {
        return field2;
    }

    public void setB_DT(String b_DT) {
        field2 = b_DT;
    }

    public String getAX_DT() {
        return field3;
    }

    public void setAX_DT(String aX_DT) {
        field3 = aX_DT;
    }

    public String getBX_DT() {
        return field4;
    }

    public void setBX_DT(String bX_DT) {
        field4 = bX_DT;
    }

}

詳細については

于 2012-09-06T17:40:07.847 に答える
1

ゲッターに「getFoo」という名前を付けると、jaxb はデフォルトで要素に「foo」という名前を付けます。要素名を明示的に定義することで問題を解決できるはずです。たとえば、次のようになります。

@XmlJavaTypeAdapter(JaxbDateAdapter.class)  
@XmlElement(name = "A_DT")
public Date getA_DT()
{
    return A_DT;
}
于 2012-09-06T17:26:21.033 に答える
0

propOrder は最初の文字を小文字にする必要があります。XMLElement の名前は @XmlElement アノテーションで変更でき、すべて正常に機能します。

変更点 -

@XmlType(propOrder = { "a_DT", "b_DT" }) 

@XmlJavaTypeAdapter(JaxbDateAdapter.class)  
@XmlElement(name = "A_DT")
public Date getA_DT()
{
    return A_DT;
}

@XmlJavaTypeAdapter(JaxbDateAdapter.class)
@XmlElement(name = "B_DT")
public Date getB_DT()
{
    return B_DT;
}
于 2012-09-06T18:27:40.297 に答える