XML Serialización

Serialización del Modelo de Mensaje java tipos a XML se realiza en última instancia utilizando JAXB de la misma manera que muchos otros Java proyectos.

Sin embargo, hay algunas advertencias importantes y restrictions, principalmente en cómo manejamos los tipos normalizados. El manejo de estos detalles está encapsulado en un XMLMapper dedicado. Esta clase debe ser vista como el lugar central para la serialización y deserialización de XML dentro del Java representación del modelo de mensaje. Una instancia de la clase XMLMapper es accesible a través de la clase ISO20022Message Model, esta instancia está preconfigurada con detalles de la Message Definition s y deben ser utilizados directamente.

XMLMapper

Las clases del modelo de mensaje IPF IS020022 NO contienen espacios de nombres codificados como típicamente lo hacen los generados por XJC. Esta es una elección de diseño consciente, los componentes del mensaje se comparten entre múltiples Message Definition s, y queremos adoptar este principio en lugar de diseñar en contra de él.

XJX & package.info

XJC y JAXB generalmente operan bajo la premisa de un único java paquete que representa un espacio de nombres (Message Definition). Esto se logra a menudo a través de un único package.info que alberga una anotación XMLSchema, detallando el espacio de nombres del asociado Message Definition y todos los Componentes de Mensaje referenciados.

Un patrón de aplicación común basado en la agrupación de un único espacio de nombres de un_Message Definition tipos fue crear un único objeto JAXBContext que cubriera todos los desplegados Message Definition s.

El XMLMapper adopta un nuevo enfoque que difiere de esto. Las clases subyacentes no tienen ningún espacio de nombres definido (como se detalla en Tipos Normalizados). En su lugar, definimos un objeto JAXBContext separado _per_Message Definition, y clave estos contextos distintos por el espacio de nombres real en el mensaje mismo.

Esto nos permite determinar el correcto message type basado en el espacio de nombres, y luego deserializar completamente el contenido en el restricted alcance de lo específico Message Definition. Desde una perspectiva de uso, esto resulta en la misma funcionalidad que la serialización JAXB tradicional (un único método para serializar/deserializar). La única diferencia es que el "nombrespaciado" ahora se maneja dentro del XMLMapper en lugar de dentro de JAXB.

Para el Message Definition Se implementa con el modelo de mensaje proporcionado el comportamiento de las funciones de XMLMapper exactamente como se describe aquí; sin embargo, consulte las notas a continuación sobre Registro de Espacios de Nombres para posibles inconvenientes si utiliza el XMLMapper con otros tipos.

Registro de Espacio de Nombres
Message Definition Los tipos s y sus espacios de nombres deben estar pre-registrados con la instancia de *XMLMapper* para poder utilizar la funcionalidad completa de las capacidades de Serialización y Deserialización.

La instancia de XMLMapper proporcionada por el ISO20022Message Model está automáticamente preconfigurada con esta información para todos los soportados Message Definition s.

Deserializar sin especificar un tipo requiere que el espacio de nombres del mensaje de destino haya sido registrado con la instancia de XMLMapper antes de la solicitud de deserialización.

Si se utiliza el XMLMapper en cualquiera de:

  1. Message Definition s que no están registrados con el XMLMapper

  2. Tipos que no son Message Definition s

Entonces puede observar comportamientos como:

  1. No se puede deserializar sin proporcionar un tipo explícito.

  2. El espacio de nombres no está poblado cuando se serializa.

Deserializando

Accediendo a la instancia de XMLMapper:

XMLMapper xmlMapper = ISO20022MessageModel.getInstance().xmlMapper();

Con Namespace

Deserializando un XML Cadena con espacio de nombres a un tipo explícito conocido:

Input example message

<? xml version="1. 0" encoding="UTF-8" standalone="yes"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain. 001. 001. 09">
    <CstmrCdtTrfInitn>
        <GrpHdr>
            <MsgId>MsgId0</MsgId>
        </GrpHdr>
    </CstmrCdtTrfInitn>
</Document>
String exampleXML =..;

//com.iconsolutions.iso20022.message.definitions.payment_initiation.pain001. Document
Document instance = xmlMapper.fromXML(exampleXML, Document.class);

El XML también puede ser deserializado como un XML cadena sin especificar un tipo explícito.

Esto requiere el xml cadena para incluir el espacio de nombres
Object instance = xmlMapper.fromXML(exampleXML);

Sin espacio de nombres

Deserializando un XML Cadena sin espacio de nombres a un tipo explícito conocido

Input example message

<? xml version="1. 0" encoding="UTF-8" standalone="yes"?>
<Document>
    <CstmrCdtTrfInitn>
        <GrpHdr>
            <MsgId>MsgId0</MsgId>
        </GrpHdr>
    </CstmrCdtTrfInitn>
</Document>
String exampleXML =..;

//com.iconsolutions.iso20022.message.definitions.payment_initiation.pain001. Document
Document instance = xmlMapper.fromXML(exampleXML, Document.class);

Tenga en cuenta que NO es posible deserializar un XML sin un espacio de nombres sin especificar un tipo explícito.

Serializando

Serializando una instancia en un XML Cadena

Tenga en cuenta que el resultado XML tendrá el espacio de nombres incluido solo si el Message Definition ha sido registrado con el XMLMapper (Esto es cierto para todos los proporcionados Message Definition s, pero puede no ser cierto si se utiliza el XMLMapper fuera del contexto del ISO20022Message Model

Document instance = Document.builder().cstmrCdtTrfInitn(
        CustomerCreditTransferInitiationV09.builder().grpHdr(
                GroupHeader85.builder().msgId("msggId123").build())
                .build())
        .build();

String xml = xmlMapper.toXML(instance);