В предыдущем посте я описал влияние аннотаций @XmlInlineBinaryData и @XmlMimeType в среде JAX-WS, где двоичные данные могут отправляться в виде вложений. Один из комментариев, которые я получил к этому посту, был о том, как генерировать эти аннотации для ваших классов при запуске из схемы XML. В этом посте я рассмотрю этот вопрос.
Модель Java
Ниже приведен тип модели Java, которую мы пытаемся сгенерировать. Средства доступа были опущены для экономии места.
package com.example; import java.awt.Image; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlInlineBinaryData; import javax.xml.bind.annotation.XmlMimeType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = {"a","b","c","d"}) @XmlRootElement(name = "root") public class Root { protected byte[] a; protected byte[] b; @XmlInlineBinaryData protected byte[] c; @XmlMimeType("image/jpeg") protected Image d; }
XML-схема
Ниже приведена схема XML, с которой мы начнем.
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.example.com" targetNamespace="http://www.example.com"> <xsd:element name="root"> <xsd:complexType> <xsd:sequence> <xsd:element name="a" minOccurs="0" type="xsd:base64Binary"/> <xsd:element name="b" minOccurs="0" type="xsd:base64Binary"/> <xsd:element name="c" minOccurs="0" type="xsd:base64Binary"/> <xsd:element name="d" minOccurs="0" type="xsd:base64Binary"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
Если мы сгенерируем Java-классы из вышеупомянутой схемы, результирующий класс будет выглядеть (средства доступа были опущены для экономии места):
package com.example; import java.awt.Image; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlInlineBinaryData; import javax.xml.bind.annotation.XmlMimeType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = {"a","b","c","d"}) @XmlRootElement(name = "root") public class Root { protected byte[] a; protected byte[] b; protected byte[] c; protected byte[] d; }
@XmlMimeType и изображение
Для создания нашего d поле с типом изображения с аннотацией @XmlMimeType мы указываем xmime: expectedContentTypes атрибут на й элемент.
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns="http://www.example.com" targetNamespace="http://www.example.com"> <xsd:element name="root"> <xsd:complexType> <xsd:sequence> <xsd:element name="a" minOccurs="0" type="xsd:base64Binary"/> <xsd:element name="b" minOccurs="0" type="xsd:base64Binary"/> <xsd:element name="c" minOccurs="0" type="xsd:base64Binary"/> <xsd:element name="d" minOccurs="0" type="xsd:base64Binary" xmime:expectedContentTypes="image/jpeg"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
Теперь, когда мы генерируем наш класс, он будет выглядеть так:
package com.example; import java.awt.Image; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlInlineBinaryData; import javax.xml.bind.annotation.XmlMimeType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = {"a","b","c","d"}) @XmlRootElement(name = "root") public class Root { protected byte[] a; protected byte[] b; protected byte[] c; @XmlMimeType("image/jpeg") protected Image d; }
@XmlInlineBinaryData
Чтобы сгенерировать аннотацию @XmlInlineBinaryData, нам нужно настроить нашу XML-схему. Это можно сделать встроенным или как показано ниже с помощью файла привязок JAXB:
Файл привязок (bindings.xml)
<jxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> <jxb:bindings schemaLocation="binary.xsd"> <jxb:bindings node="//xsd:element[@name='root']/xsd:complexType/xsd:sequence/xsd:element[@name='c']"> <jxb:inlineBinaryData/> </jxb:bindings> </jxb:bindings> </jxb:bindings>
Файл привязок передается как параметр в вызов XJC:
xjc -d out -b bindings.xml binary.xsd
Результирующий класс Java будет:
package com.example; import java.awt.Image; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlInlineBinaryData; import javax.xml.bind.annotation.XmlMimeType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = {"a","b","c","d"}) @XmlRootElement(name = "root") public class Root { protected byte[] a; protected byte[] b; @XmlInlineBinaryData protected byte[] c; @XmlMimeType("image/jpeg") protected Image d; }
От http://blog.bdoughan.com/2011/05/schema-to-java-xmlmimetype.html