enter code here
以下に示すように、2つのインターフェースにまたがる顧客のプロパティがあります。サブインターフェイスICustomerを使用して外部xmlバインディングを定義しています。pojoをxmlにマーシャリングすると、MoxyがスーパーインターフェイスのプロパティfirstNameを無視しているように見えます。これはバグですか、それともxmlメタデータでこれら2つのインターフェイスのそれぞれを明示的に指定する必要がありますか?
ベースインターフェース
public interface IBaseCustomer
{
String getFirstName();
void setFirstName(final String firstName);
}
サブインターフェース
public interface ICustomer extends IBaseCustomer
{
String getLastName();
void setLastName(final String lastName);
Address getAddress();
void setAddress(final Address address);
List<PhoneNumber> getPhoneNumbers();
void setPhoneNumbers(final List<PhoneNumber> phoneNumbers);
void setPrefix(final String prefix);
String getPrefix();
}
メタデータxml
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="blog.bindingfile">
<xml-schema namespace="http://www.example.com/customer" element-form-default="QUALIFIED" />
<java-types>
<java-type name="ICustomer">
<xml-root-element name="customer"/>
<xml-type prop-order="firstName lastName address phoneNumbers" />
<java-attributes>
<xml-element java-attribute="firstName" name="first-name" />
<xml-element java-attribute="lastName" name="last-name" />
<xml-element java-attribute="phoneNumbers" name="phone-number" />
</java-attributes>
</java-type>
<java-type name="PhoneNumber">
<java-attributes>
<xml-attribute java-attribute="type" />
<xml-value java-attribute="number" />
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
出力
<customer xmlns="http://www.example.com/customer">
<prefix>pre</prefix>
</customer>
デモコード
Map<String, Object> properties = new HashMap<String, Object>(1);
InputStream resourceAsStream = Demo.class.getResourceAsStream("xml-bindings.xml");
properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, resourceAsStream);
JAXBContext jc = JAXBContext.newInstance("blog.bindingfile", ICustomer.class.getClassLoader(), properties);
ICustomer customer = new Customer();
customer.setPrefix("pre");
customer.setFirstName("firstName");
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(customer, System.out);