JAXB的@XmlElement(name ="")在Mule中不起作用

时间:2014-05-21 09:36:22

标签: java jaxb mule

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "AccountResponse")
public class AccountResponse {
    @XmlElement(name = "AccountNumber")
    protected long accountNumber;
     public long getAccountNumber() {
        return accountNumber;
    }
    public void setAccountNumber(long value) {
        this.accountNumber = value;
    }
}

在上面提到的代码片段中,我试图用 AccountNumber 使用@XmlElement annotation修饰 accountNumber .Code正在执行而不会抛出任何异常。但没有得到预期的产出。 如何解决这个问题?

预期产出:

<AccountResponse>
    <AcconutNumber>1234</AccountNumber>
</AccountResponse>

实际输出(我得到的):

<AccountResponse>
    <acconutNumber>1234</accountNumber>
</AccountResponse>

注意:我正在使用来自Mule Runtime Library 3.4的JAXB jar。

提前致谢!

2 个答案:

答案 0 :(得分:1)

在我看来,你所做的几乎是正确的,但你应该尝试在getter而不是Field上使用你的注释:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "AccountResponse")
public class AccountResponse {
    protected long accountNumber;

    @XmlElement(name = "AccountNumber")
    public long getAccountNumber() {
        return accountNumber;
    }
    public void setAccountNumber(long value) {
        this.accountNumber = value;
    }
}

根据您的配置,可能会从getter而不是字段名称创建xml标记名称。在这种情况下,我猜它发生了。

答案 1 :(得分:0)

在您的问题的AccountResponse课程中运行以下代码:

import javax.xml.bind.*;

public class Demo {

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

        AccountResponse ar = new AccountResponse();
        ar.setAccountNumber(1234);

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

}

将为您提供您期望的XML响应:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AccountResponse>
    <AccountNumber>1234</AccountNumber>
</AccountResponse>

确定问题

  1. 如果您在针对AccountResponse课程运行此演示代码时获得相同的输出,则问题在于Mule。
  2. 如果您获得不同的输出,则可能因为添加了AccountResponse注释而未重新编译@XmlElement(name = "AccountNumber")类。