Gre*_*ala 6 java xml annotations jaxb
我有一个已经为JPA注释的java bean,我也希望将其存储为XML,特别是FIXML.目标是使用注释管理从bean到XML的映射.
我在网上看到有关指定模式和让JAXB生成类的相关主题,但我不想这样做.
我一直在寻找使用JAXB注释,但似乎我需要为每个子元素创建新类.我试图远离那个,让注释显示如何构建子元素.JAXB似乎不想这样做.
这有可能,怎么样?我是否需要制作自己的注释并忘记JAXB?
豆:
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
解析:
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);
Run Code Online (Sandbox Code Playgroud)
期望的结果XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FIXML>
<ExecRpt Acct="account_data">
<Hdr SID="sender"/>
</ExecRpt>
</FIXML>
Run Code Online (Sandbox Code Playgroud)
当前产生的XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FIXML Acct="account_data" SID="sender"/>
Run Code Online (Sandbox Code Playgroud)
很明显,我还没有提供足够的信息来映射子元素,但我也不确定如何提供它.我想添加一些@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;
}
}
Run Code Online (Sandbox Code Playgroud)
演示代码
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);
}
}
Run Code Online (Sandbox Code Playgroud)
生成的 XML
<?xml version="1.0" encoding="UTF-8"?>
<FIXML>
<ExecRpt Acct="account_data">
<Hdr SID="sender"/>
</ExecRpt>
</FIXML>
Run Code Online (Sandbox Code Playgroud)
指定 EclipseLink JAXB (MOXy) 实现
要将 MOXy 指定为 JAXB 实现,您需要在ExecutionReport类中添加一个名为jaxb.properties的文件,其中包含以下条目:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Run Code Online (Sandbox Code Playgroud)
了解更多信息