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;
    }
}

我认为 Date Adapter 类与问题无关。

我正在使用 Eclipse Indigo Service Release Version 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   

另一个有趣的观察是,如果我有这样的字段名称(如下),一切正常!以下情况的唯一区别是字段名称在下划线之前有两个大写字母而不是一个。

@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 将查看属性名称(请参见下面的代码示例)。JAXB 会将属性名称中的第一个字母(getA_DT对应于属性a_DT)小写,除非连续有两个大写字母(getAX_DT对应于属性AX_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

当 getter 命名为“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 回答