gpt4 book ai didi

java - 如何将单个 java bean 编码到具有现有注释的复杂 XML 文档中?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:19:15 26 4
gpt4 key购买 nike

我有一个已为 JPA 注释的 java bean,我也希望将其存储为 XML,特别是 FIXML .目标是使用注释管理从 bean 到 XML 的映射。

我在网上看到有关指定模式和让 JAXB 生成类的相关主题,但我不想那样做。

我一直在考虑使用 JAXB 注释,但似乎我需要为每个子元素创建新的类。我试图远离它,让注释显示如何构造子元素。 JAXB 似乎不想这样做。

这可能吗?如何实现?我是否需要制作自己的注释而忘记 JAXB?

具体例子

bean 类:

@Entity
@XmlRootElement(name="FIXML")
@XmlType(name="ExecRpt")
public class ExecutionReport implements Serializable {
private String account;
private String senderCompID;

@Column(name="ACCOUNT", nullable=true, length=64)
@XmlAttribute(name="Acct")
public String getAccount() {
return this.account;
}
public void setAccount(String account) {
this.account = account;
}

@Column(name="SENDER_COMP_ID", nullable=true, length=200)
@XmlAttribute(name="SID")
public String getSenderCompID() {
return this.senderCompID;
}
public void setSenderCompID(String senderCompID) {
this.senderCompID = senderCompID;
}
}

解析:

JAXBContext context = JAXBContext.newInstance(ExecutionReport.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); //pretty print XML
marshaller.marshal(executionReport, System.out);

所需的结果 XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FIXML>
<ExecRpt Acct="account_data">
<Hdr SID="sender"/>
</ExecRpt>
</FIXML>

当前生成的 XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FIXML Acct="account_data" SID="sender"/>

很明显,我还没有提供足够的信息来映射子元素,但我也不确定如何提供它。我想添加一些@XmlElement注解,但是我没有子对象,所有的数据都在这个类中。

好处是我的 XML 并不比这个例子复杂多少;只有少数元素,每条消息只出现一次。给我带来麻烦的是从一个 bean 中获取多个元素。

最佳答案

您可以在 EclipseLink JAXB (MOXy) 中使用 @XmlPath 扩展为此,我是技术主管。

模型类

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@Entity
@XmlRootElement(name="FIXML")
@XmlType(name="ExecRpt")
public class ExecutionReport implements Serializable {
private String account;
private String senderCompID;

@Column(name="ACCOUNT", nullable=true, length=64)
@XmlPath("ExecRpt/@Acct")
public String getAccount() {
return this.account;
}
public void setAccount(String account) {
this.account = account;
}

@Column(name="SENDER_COMP_ID", nullable=true, length=200)
@XmlPath("ExecRpt/Hdr/@SID")
public String getSenderCompID() {
return this.senderCompID;
}
public void setSenderCompID(String senderCompID) {
this.senderCompID = senderCompID;
}
}

演示代码

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

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

ExecutionReport er = new ExecutionReport();
er.setAccount("account_data");
er.setSenderCompID("sender");

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

}

生成的 XML

<?xml version="1.0" encoding="UTF-8"?>
<FIXML>
<ExecRpt Acct="account_data">
<Hdr SID="sender"/>
</ExecRpt>
</FIXML>

指定 EclipseLink JAXB (MOXy) 实现

要将 MOXy 指定为 JAXB 实现,您需要在 ExecutionReport 类中添加一个名为 jaxb.properties 的文件,其中包含以下条目:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

了解更多信息

关于java - 如何将单个 java bean 编码到具有现有注释的复杂 XML 文档中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4810922/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com