Статьи

Схема в Java: @XmlMimeType & @XmlInlineBinaryData

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