我可以在谷歌上找到的只有3条信息,最详细的是设计文件,如下网址
http://wiki.eclipse.org/EclipseLink/DesignDocs/317962/Phase2.1#.40XmlProperty
它确实提到了“xml-property元数据标记将用于配置属性”。并给出了两个没有编组结果的例子如下:
Example: type-level property
The following example will demonstrate how a type-level property can be applied.
Setting xml-property on a type via EclipseLink XML metadata can be accomplished as follows:
<java-type name="org.example.Employee">
<xml-properties>
<xml-property name="identifier" value="101" value-type="java.lang.Integer" />
<xml-property name="isTrue" value="false" value-type="java.lang.Boolean" />
</xml-properties>
</java-type>
Setting @XmlProperty on a type via annotations can be accomplished as follows:
org.example.Employee.java
@XmlProperties({@XmlProperty(name="identifier", value="101", valueType=Integer.class),
@XmlProperty(name="isTrue", value="false", valueType=Boolean.class)})
public class Employee {
...
}
Example: property-level property
The following example will demonstrate how a property-level property can be applied.
Setting xml-property on a property via EclipseLink XML metadata can be accomplished as follows:
<java-type name="org.example.Employee">
<java-attributes>
<xml-element java-attribute="myelement">
<xml-properties>
<xml-property name="isAttribute" value="false" value-type="java.lang.Boolean" />
<xml-property name="comment" value="this is an element" />
</xml-properties>
</xml-element>
</java-attributes>
</java-type>
Setting @XmlProperty on a property via annotations can be accomplished as follows:
org.example.Employee.java
public class Employee {
@XmlProperties({@XmlProperty(name="isAttribute", value="false", valueType=Boolean.class),
@XmlProperty(name="comment", value="this is an element")}
public String myelement;
}我也尝试了我的示例,但我无法区分使用和不使用xml属性的内容之间的任何区别。
谁能给我解释一下XmlProperty是做什么的?它会产生什么样的效果?或者什么时候使用XmlProperty?有没有包含封送处理结果的示例代码?
<?xml version="1.0"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.eclipse.org/eclipselink/xsds/persistence/oxm http://www.eclipse.org/eclipselink/xsds/eclipselink_oxm_2_4.xsd"
version="2.1">
<xml-schema element-form-default="QUALIFIED">
<xml-ns prefix="ns1" namespace-uri="http://www.example.org/customer" />
<xml-ns prefix="ns2" namespace-uri="http://www.example.org/phone" />
<xml-ns prefix="ns3" namespace-uri="http://www.example.org/addr" />
</xml-schema>
<java-types>
<java-type name="example.gettingstarted.demo1.Customer">
<xml-root-element />
<xml-type namespace="http://www.example.org/customer"
prop-order="name address phoneNumbers" />
<xml-properties>
<xml-property name="hello" value="false" value-type="java.lang.String" />
<xml-property name="world" value="this is an element"
value-type="java.lang.String" />
</xml-properties>
<java-attributes>
<xml-attribute java-attribute="name" xml-path="@name" />
<xml-element java-attribute="address">
</xml-element>
<xml-element java-attribute="phoneNumbers" xml-path="contact-info/phone-number" />
</java-attributes>
</java-type>
<java-type name="example.gettingstarted.demo1.PhoneNumber">
<xml-root-element />
<xml-type namespace="http://www.example.org/phone"></xml-type>
<java-attributes>
<xml-attribute java-attribute="type" />
<xml-value java-attribute="value" />
</java-attributes>
</java-type>
<java-type name="example.gettingstarted.demo1.Address">
</java-type>
</java-types>
</xml-bindings>Java文件:
package example.gettingstarted.demo5;
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.JAXBContextFactory;
import example.gettingstarted.demo1.Address;
import example.gettingstarted.demo1.Customer;
import example.gettingstarted.demo1.PhoneNumber;
/**
* @author barry
* make Customer.Address.street as Customer.@street
*/
public class Demo {
@SuppressWarnings({ "rawtypes", "deprecation" })
public static void main(String[] args) throws JAXBException {
// Step 1 - Create the Domain Model
Customer customer = new Customer();
customer.setName("Jane Doe");
Address address = new Address();
address.setStreet("123 Any Street");
address.setCity("My Town");
customer.setAddress(address);
PhoneNumber workPhoneNumber = new PhoneNumber();
workPhoneNumber.setType("work");
workPhoneNumber.setValue("613-555-1111");
customer.getPhoneNumbers().add(workPhoneNumber);
PhoneNumber cellPhoneNumber = new PhoneNumber();
cellPhoneNumber.setType("cell");
cellPhoneNumber.setValue("613-555-2222");
customer.getPhoneNumbers().add(cellPhoneNumber);
// Step 2 - Convert the Domain Model to XML
final Map<String, Source> metadataSourceMap = new HashMap<String, Source>();
metadataSourceMap.put("example.gettingstarted.demo1", new StreamSource("./example/gettingstarted/demo5/eclipselink-oxm.xml"));
final Map<String, Object> properties = new HashMap<String, Object>();
properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, metadataSourceMap);
final Class[] classes = new Class[1];
classes[0] = Customer.class;
JAXBContext jaxbContext = (JAXBContext) JAXBContext.newInstance(classes, properties);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);
}
}不管是否应用了xml-property,我的输出如下所示。
My Town 123 Any Street 613-555-1111 613-555-2222发布于 2013-03-27 18:15:18
的@XmlProperty扩展是一种将自定义数据放入MOXy原生映射元数据的方法。它用于一些非常独特的用例。我将在下面演示如何使用它。
JAVA模型
在这个示例中,我将使用以下模型。
package forum15651379;
public class Foo {
private String bar;
public String getBar() {
return bar;
}
public void setBar(String bar) {
this.bar = bar;
}
}演示代码
在下面的演示代码中,JAXBContext将被引导到MOXy的外部映射文档(参见:http://blog.bdoughan.com/2010/12/extending-jaxb-representing-annotations.html)。
package forum15651379;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String, Object>(1);
properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum15651379/oxm.xml");
JAXBContext jc = JAXBContext.newInstance(new Class[] {Foo.class}, properties);
Foo foo = new Foo();
foo.setBar("Hello World");
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(foo, System.out);
}
}常见用例
下面是典型的用例。映射使用java-attributes元素定义。
oxm.xml
<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="forum15651379">
<java-types>
<java-type name="Foo">
<xml-root-element name="FOO"/>
<java-attributes>
<xml-element java-attribute="bar" name="BAR">
</xml-element>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>输出
<?xml version="1.0" encoding="UTF-8"?>
<FOO>
<BAR>Hello World</BAR>
</FOO>高级用例
oxm.xml
我扩展了oxm.xml以包含属性,并指定了一个描述符定制器。
<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="forum15651379">
<java-types>
<java-type name="Foo" xml-customizer="forum15651379.FooCustomizer">
<xml-properties>
<xml-property name="key1" value="value1"/>
<xml-property name="key2" value="value2"/>
</xml-properties>
<xml-root-element name="FOO"/>
<java-attributes>
<xml-element java-attribute="bar" name="BAR">
<xml-properties>
<xml-property name="key3" value="value3"/>
<xml-property name="key4" value="value4"/>
</xml-properties>
</xml-element>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>描述符定制器(FooCustomizer)
描述符定制器允许您访问MOXy的原生映射元数据。下面是一个简单的示例,展示了如何处理oxm.xml文件中指定的属性。
package forum15651379;
import org.eclipse.persistence.config.DescriptorCustomizer;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.mappings.XMLDirectMapping;
public class FooCustomizer implements DescriptorCustomizer{
@Override
public void customize(ClassDescriptor descriptor) throws Exception {
XMLDescriptor xmlDescriptor = (XMLDescriptor) descriptor;
String key1Value = (String) xmlDescriptor.getProperty("key1");
xmlDescriptor.setDefaultRootElement(key1Value);
XMLDirectMapping barMapping = (XMLDirectMapping) xmlDescriptor.getMappingForAttributeName("bar");
String key3Value = (String) barMapping.getProperty("key3");
barMapping.setXPath(key3Value + "/text()");
}
}输出
下面我们将看到我们在FooCustomizer中所做的事情对生成的XML的影响。
<?xml version="1.0" encoding="UTF-8"?>
<value1>
<value3>Hello World</value3>
</value1>https://stackoverflow.com/questions/15651379
复制相似问题