XmlAdapter para base64Binary resultados en String
jaxb xsd (2)
Esta clase "adapters.X509CertificateAdapter" declara dos métodos:
public X509Certificate unmarshal(String certificateBase64String) throws Exception;
public String marshal(X509Certificate certificate) throws Exception;
La primera declaración necesita una cadena para desempaquetar un certificado X509. De esta forma, puede usar directamente un Certificado X509.
Espero haberles dado todas las respuestas sobre su pregunta
Tengo un archivo XSD que contiene esto:
<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>
y cuando genero código java con xjc, produce esto:
public class Certificate {
@XmlElement(required = true, type = String.class)
@XmlJavaTypeAdapter(X509CertificateAdapter.class)
@XmlSchemaType(name = "base64Binary")
protected X509Certificate certificate;
....
}
y el adaptador funciona bien
Mi pregunta es por qué @XmlElement(required = true, type = String.class)
? ¿Por qué type = String.class
y no byte[]
?
Para el siguiente:
@XmlElement(required = true, type = String.class)
@XmlJavaTypeAdapter(X509CertificateAdapter.class)
@XmlSchemaType(name = "base64Binary")
protected X509Certificate certificate;
Hay algunas cosas a tener en cuenta:
- La configuración de
type
en@XmlElement
es redundante ya que elX509CertificateAdapter
ya especifica que, a los fines de ordenar y desasignar, convertiráX508Certificate
en / desde unaString
. - El
X509CertificateAdapter
convierte en / desde unaString
lugar de unbyte[]
más probable para el rendimiento, ya que una conversión a unbyte[]
haría que JAXB realice una conversión adicional aString
para representarlo correctamente en el XML. - La anotación
@XmlSchemaType
se utiliza para garantizar que cuando se genere un esquema XML, el tipo de nodo aparezca comobase64Binary
y no comostring
.