1

私がグーグルで見つけることができるのはたった3つの情報であり、最も詳細なのは次のURLのデザインドキュメントです

http://wiki.eclipse.org/EclipseLink/DesignDocs/317962/Phase2.1#.40XmlProperty

「xml-propertyメタデータタグを使用してプロパティを構成する」と記載されています。マーシャリングの結果がない2つの例を次に示します。

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-propertyのものがある場合とない場合の違いがわかりません。

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

4

1 に答える 1

0

EclipseLink JAXB(MOXy)@XmlProperty拡張機能は、カスタムデータをMOXyのネイティブマッピングメタデータに取り込む方法です。これは、かなりユニークなユースケース向けです。これをどのように使用できるかを以下に示します。

JAVAモデル

この例では、次のモデルを使用します。

package forum15651379;

public class Foo {

    private String bar;

    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

}

デモコード

以下のデモコードでは、JAXBContextMOXyの外部マッピングドキュメントにブートストラップされます(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>
于 2013-03-27T10:15:17.540 に答える