Set an XJC javaType adapter in external binding file

14,855

Change your xsd in

<xsd:complexType name="Certificate">
    <xsd:sequence>
        <xsd:element name="certificate" type="xsd:base64Binary"/>
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="User">
    <xsd:sequence>
        <xsd:element name="certificate" type="xsd:base64Binary"/>
        <xsd:element name="name" type="xsd:string"/>
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Server">
    <xsd:sequence>
        <xsd:element name="document" type="xsd:base64Binary" />
    </xsd:sequence>
</xsd:complexType>

and add this binding configuration

<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:annox="http://annox.dev.java.net"
    xmlns:namespace="http://jaxb2-commons.dev.java.net/namespace-prefix">
    <bindings schemaLocation="yourXSD.xsd">

            <bindings node="//xsd:complexType[@name='Certificate']//xsd:sequence//xsd:element[@name='certificate']">
                <xjc:javaType name="java.security.cert.X509Certificate" adapter="adapters.X509CertificateAdapter" />
            </bindings>
            <bindings node="//xsd:complexType[@name='User']//xsd:sequence//xsd:element[@name='certificate']">
                <xjc:javaType name="java.security.cert.X509Certificate" adapter="adapters.X509CertificateAdapter" />
            </bindings>

    </bindings>
</bindings>
Share:
14,855
Roman Kos
Author by

Roman Kos

Updated on June 04, 2022

Comments

  • Roman Kos
    Roman Kos almost 2 years

    I've an XSD file containing this:

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    jaxb:extensionBindingPrefixes="xjc"
    elementFormDefault="qualified"
    targetNamespace="http://example.org/">
    
    <xsd:complexType name="Certificate">
        <xsd:sequence>
            <xsd:element name="certificate" type="xsd:base64Binary">
                <xsd:annotation>
                    <xsd:appinfo>
                        <xjc:javaType name="java.security.cert.X509Certificate" adapter="adapters.X509CertificateAdapter" />
                    </xsd:appinfo>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    
    </xsd:schema>
    
    <xsd:complexType name="User">
        <xsd:sequence>
            <xsd:element name="certificate" type="xsd:base64Binary">
                <xsd:annotation>
                    <xsd:appinfo>
                        <xjc:javaType name="java.security.cert.X509Certificate" adapter="adapters.X509CertificateAdapter" />
                    </xsd:appinfo>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="name" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
    
    <xsd:complexType name="Server">
        <xsd:sequence>
            <xsd:element name="document" type="xsd:base64Binary" />
        </xsd:sequence>
    </xsd:complexType>
    

    I would like to export xjc javaType adapter to an external .xjb file. In this file, I would like to set this adapter for all certificate elements with xsd:base64Binary type but not for document element in Server complex type which also has xsd:base64Binary type.

    How can I do it?

  • Roman Kos
    Roman Kos almost 10 years
    Yes it's pretty much what I expected as solution, node by node. But is it possible to put it in globalBindings to avoid repeating it every time I will add a new certificate element ?
  • Xstian
    Xstian almost 10 years
    Yes it is using <bindings version="2.0" xmlns="java.sun.com/xml/ns/jaxb" xmlns:xsd="w3.org/2001/XMLSchema" xmlns:xjc="java.sun.com/xml/ns/jaxb/xjc" xmlns:annox="annox.dev.java.net"> <globalBindings> <xjc:javaType xmlType="xsd:base64Binary" name="java.security.cert.X509Certificate" adapter="adapters.X509CertificateAdapter" /> </globalBindings> </bindings>
  • Roman Kos
    Roman Kos almost 10 years
    But in this case all xsd:base64Binary will use the adapter, even the element document in complex type Server, which I don't want in this case.
  • Xstian
    Xstian almost 10 years
    yes ... global binding is for each xmlType, i think that in your case is better the first solution.