ADD - XMLHelper

This commit is contained in:
atravieso 2025-07-17 09:53:33 -04:00
parent c1a419f3dc
commit a968d9ebba
3 changed files with 90 additions and 5 deletions

14
pom.xml
View File

@ -15,6 +15,8 @@
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
<java.version>17</java.version> <java.version>17</java.version>
<jakarta.jaxb.api.version>4.0.0</jakarta.jaxb.api.version>
<jakarta.jaxb.impl.version>4.0.5</jakarta.jaxb.impl.version>
</properties> </properties>
<dependencies> <dependencies>
@ -37,6 +39,18 @@
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- Dependencias de JAXB para JDK 17 (Jakarta EE) -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>${jakarta.jaxb.api.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>${jakarta.jaxb.impl.version}</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -1,10 +1,5 @@
package com.banesco.common.infraestructure.helpers; package com.banesco.common.infraestructure.helpers;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
@ -12,6 +7,11 @@ import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public class JsonHelper { public class JsonHelper {
private static final Logger logger = Logger.getLogger(JsonHelper.class.getName()); private static final Logger logger = Logger.getLogger(JsonHelper.class.getName());

View File

@ -0,0 +1,71 @@
package com.banesco.common.infraestructure.helpers;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBElement;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Marshaller;
public class XmlHelper {
private static final Logger logger = Logger.getLogger(XmlHelper.class.getName());
/**
* Imprime el contenido XML de un objeto JAXBElement en el log.
* Utiliza JAXB para serializar el objeto a XML y lo formatea para una mejor legibilidad.
*
* @param element El JAXBElement que contiene el objeto a serializar a XML.
* @param traceId requestID.
* @throws JAXBException Si ocurre un error durante la serialización JAXB.
*/
public static void printXml(JAXBElement<?> element, String traceId) throws JAXBException {
// Verifica si el elemento es nulo para evitar NullPointerException
Objects.requireNonNull(element, "El JAXBElement no puede ser nulo.");
// Obtiene el tipo declarado del elemento para crear el contexto JAXB.
// Esto asegura que JAXB conozca la clase raíz del objeto que se va a serializar.
Class<?> declaredType = element.getDeclaredType();
// Crea una instancia de JAXBContext para el tipo declarado.
// JAXBContext es costoso de crear, en aplicaciones de alto rendimiento
// se suele cachear o reutilizar. Para este caso de log, es aceptable crearlo aquí.
JAXBContext ctx = JAXBContext.newInstance(declaredType);
// Crea un Marshaller, que es responsable de convertir objetos Java a XML.
Marshaller marshaller = ctx.createMarshaller();
// Configura la propiedad para que el XML de salida esté formateado (indentado).
// Esto hace que el XML sea mucho más legible en los logs.
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// Configura la propiedad para que el XML no incluya la declaración XML (<?xml version="1.0" encoding="UTF-8" standalone="yes"?>).
// Esto puede ser útil si solo quieres el contenido XML puro en el log,
// pero a menudo es mejor dejarlo si quieres un XML completo y válido.
// marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
// Usa ByteArrayOutputStream para capturar la salida XML en memoria.
// Esto es necesario porque Marshaller escribe en un OutputStream,
// y necesitamos obtener el String resultante para el log.
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
// Realiza la serialización del JAXBElement al OutputStream.
marshaller.marshal(element, outputStream);
// Convierte el contenido del ByteArrayOutputStream a un String.
// Es crucial especificar la codificación (UTF-8 es lo más común)
// para asegurar que los caracteres se interpreten correctamente.
String xmlString = outputStream.toString(StandardCharsets.UTF_8.name());
// Loggea el XML generado.
logger.log(Level.INFO, traceId + " - XML del servicio SOAP:\n{0}", xmlString);
} catch (IOException e) {
// Manejo de excepción si hay un problema con el ByteArrayOutputStream (poco probable en este caso).
logger.log(Level.SEVERE, "Error al procesar el OutputStream para el XML", e);
}
}
}