В предыдущем посте я описал влияние аннотаций @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