diff --git a/pom.xml b/pom.xml index 4882d52..5f1c7fe 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,8 @@ 17 17 17 + 4.0.0 + 4.0.5 @@ -37,6 +39,18 @@ provided + + + jakarta.xml.bind + jakarta.xml.bind-api + ${jakarta.jaxb.api.version} + + + org.glassfish.jaxb + jaxb-runtime + ${jakarta.jaxb.impl.version} + + diff --git a/src/main/java/com/banesco/common/infraestructure/helpers/JsonHelper.java b/src/main/java/com/banesco/common/infraestructure/helpers/JsonHelper.java index 7ed8431..1315bb0 100644 --- a/src/main/java/com/banesco/common/infraestructure/helpers/JsonHelper.java +++ b/src/main/java/com/banesco/common/infraestructure/helpers/JsonHelper.java @@ -1,10 +1,5 @@ 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.InputStream; import java.util.ArrayList; @@ -12,6 +7,11 @@ import java.util.List; import java.util.logging.Level; 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 { private static final Logger logger = Logger.getLogger(JsonHelper.class.getName()); diff --git a/src/main/java/com/banesco/common/infraestructure/helpers/XmlHelper.java b/src/main/java/com/banesco/common/infraestructure/helpers/XmlHelper.java new file mode 100644 index 0000000..b9e7470 --- /dev/null +++ b/src/main/java/com/banesco/common/infraestructure/helpers/XmlHelper.java @@ -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 (). + // 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); + } + } + +} \ No newline at end of file