Ir al contenido principal

Entradas

Mostrando las entradas con la etiqueta Java

Gestión de Horas en Java: Validando Rangos con Strings (Una guía práctica para desarrolladores)

¡Hola, comunidad de desarrolladores! 👩‍💻👨‍💻 En el mundo de la programación, a menudo nos encontramos con desafíos inesperados. Uno de ellos, sorprendentemente común, es la gestión de horas guardadas como Strings en lugar de tipos de datos diseñados para fechas y horas. Esto puede complicar operaciones simples, como verificar si una hora se encuentra dentro de un rango determinado. Aunque lo ideal es usar clases como LocalTime o LocalDateTime para este tipo de tareas, a veces las limitaciones del sistema o una base de datos legacy nos obligan a trabajar con cadenas de texto. Si te encuentras en esta situación y necesitas una solución pragmática sin depender de librerías externas o complejas consultas a la base de datos, ¡estás en el lugar correcto! A continuación, te mostramos cómo puedes abordar este problema directamente desde tu código en Java. La lógica que presentamos aquí puede ser adaptada y mejorada en cualquier otro lenguaje de programación. Paso 1: Normalizando y format...

Manejo de consultas nativas en Java: Cómo convertir Object[] a una clase (Sin Hibernate)

¡Hola a todos los programadores! 👨‍💻👩‍💻 En nuestro día a día, a menudo nos encontramos con situaciones donde necesitamos hacer consultas directas a la base de datos que no están mapeadas a una clase o entidad. Aunque frameworks como Hibernate o JPA hacen este trabajo de forma automática, a veces nos topamos con código legacy, clases de servicio complejas o consultas muy específicas que nos obligan a trabajar con resultados "crudos". Si te ha pasado que una consulta nativa te devuelve un listado de Object[] y te preguntas cómo transformarlo en una clase Java que puedas usar fácilmente, ¡has llegado al lugar correcto! En este artículo, te mostraremos una solución práctica y temporal para este problema. El problema: NativeQuery y sus resultados Cuando realizamos una consulta nativa usando entityManager.createNativeQuery() , el resultado por defecto es una lista de objetos genéricos ( List<Object[]> ), donde cada Object[] representa una fila de la tabla. El reto es t...

Gestión precisa de valores decimales en Java: Un enfoque práctico para BigDecimal

¡Hola, comunidad de desarrolladores! 👩‍💻👨‍💻 En el desarrollo de software, especialmente en aplicaciones financieras o de negocios, la precisión en los cálculos decimales es fundamental. A menudo, trabajar con tipos de datos double o float puede llevar a errores de precisión que, aunque parezcan insignificantes, pueden causar grandes problemas. En este artículo, te voy a mostrar una solución práctica para manejar y formatear valores double a un BigDecimal con una precisión de dos decimales, lo que garantiza cálculos exactos y evita sorpresas. Este método es versátil y se puede adaptar fácilmente para manejar cualquier número de decimales que necesites. El problema: La precisión de double El tipo de dato double es útil para cálculos rápidos, pero su representación en memoria puede generar imprecisiones. Por ejemplo, al realizar una operación simple como 0.1 + 0.2, el resultado no es 0.3 exacto, sino algo como 0.30000000000000004. En cálculos críticos, esto no es aceptable. La so...

Alineando columnas en rich:dataTable de RichFaces: Un truco rápido y efectivo 💻

En el mundo del desarrollo web con JSF y frameworks como RichFaces, la estética y la usabilidad de las tablas de datos ( dataTable ) son cruciales. Alinear correctamente el contenido de las columnas puede hacer que la información sea mucho más legible y profesional. Si alguna vez te has preguntado cómo alinear el texto de las columnas en un rich:dataTable , te alegrará saber que es un proceso muy sencillo. No necesitas complicadas clases CSS ni reescribir estilos globales. RichFaces nos permite hacerlo directamente con una propiedad en el rich:column . El truco: Utilizando la propiedad style Para alinear el contenido de una columna, simplemente debes usar la propiedad style dentro del tag <rich:column> y asignarle la propiedad CSS text-align . Aquí tienes el código de ejemplo que muestra cómo centrar el texto de una columna.  <rich:column style="text-align: center">     <f:facet name="header">         <h:outputText value="Mi Colu...

Generación de PDFs en Java: Un enfoque práctico usando HTML y iText 🚀

¡Hola, desarrolladores! En el desarrollo de aplicaciones empresariales, es muy común la necesidad de generar documentos en formato PDF de manera dinámica. Ya sea para facturas, reportes o cartas, la capacidad de convertir contenido HTML en un PDF es una habilidad muy valiosa. En este artículo, te voy a mostrar una forma sencilla y efectiva de crear archivos PDF en Java, utilizando una librería popular como iText . Lo más interesante de este método es que nos permite definir el contenido y la estructura del documento usando HTML, lo que facilita enormemente el diseño y la personalización. Aquí te presento un ejemplo de código que ilustra el proceso. Paso 1: Generar el cuerpo HTML del PDF El primer paso es construir el contenido que queremos convertir a PDF. Lo haremos como si estuviéramos creando una página web, utilizando un StringBuilder para ir agregando las etiquetas HTML. En este ejemplo, creamos una carta básica con la fecha, un saludo y un cuerpo de texto. /**  * Obtiene el ...

Comprimir archivos en Java: Una guía práctica para manejar archivos .zip 📦

¡Hola, desarrolladores! En el desarrollo de aplicaciones, la compresión de archivos es una tarea común, ya sea para reducir el tamaño de los datos o para empaquetar varios archivos en uno solo. Aunque Java ha evolucionado, las bases de la compresión de archivos siguen siendo relevantes. Recientemente, me encontré con un código que escribí hace unos años para comprimir directorios en un archivo .zip , y me di cuenta de que sigue siendo una solución válida y funcional. En este artículo, te voy a mostrar cómo puedes implementar esta lógica en Java, utilizando las clases nativas para manejar archivos comprimidos. La lógica detrás de la compresión La solución que te muestro aquí se basa en tres métodos principales: zipDir : Este método principal inicia el proceso. Recibe la ruta del directorio que se quiere comprimir y coordina las demás operaciones. generateFileList : Este es un método recursivo que se encarga de recorrer todo el directorio (y sus subdirectorios) para crear una lista de to...

Redondeo de números en Java: Una función simple para BigDecimal 🔢

¡Hola, desarrolladores! En el desarrollo de software, especialmente cuando se trabaja con operaciones financieras o cálculos de precisión, el redondeo de números es una tarea común. Es fundamental hacerlo de la manera correcta para evitar errores y mantener la exactitud. A diferencia de los tipos de datos primitivos como double o float , la clase java.math.BigDecimal ofrece un control preciso sobre el redondeo. Te mostraré una función simple pero poderosa que te permitirá redondear un número hacia arriba o hacia abajo de forma eficiente. La función para redondear con BigDecimal El siguiente método estático te permite redondear un BigDecimal a una escala (número de decimales) específica, controlando la dirección del redondeo con un simple parámetro booleano. /**  * Redondea un número BigDecimal hacia arriba o hacia abajo.  * * @param d El número BigDecimal a redondear.  * @param scale La cantidad de decimales a los que se redondeará.  * @param roundUp Si es 'true',...

Eliminando carpetas y archivos en Java: Una guía para el borrado recursivo 📂

¡Hola, desarrolladores! En el manejo de archivos en Java, una tarea común es borrar el contenido de una carpeta. La complejidad surge cuando esa carpeta contiene subcarpetas y archivos dentro de ellas. Un simple delete() no funcionará en un directorio con contenido. Para resolver esto, necesitamos una función recursiva que se encargue de eliminar cada elemento, desde lo más profundo hasta la carpeta principal. A continuación, te muestro una solución limpia y eficiente para eliminar de forma recursiva una carpeta y todo su contenido. El método: deleteFolder Esta función recibe un objeto File que representa la carpeta que queremos eliminar. La lógica es simple: si es un archivo, lo borra; si es una carpeta, se llama a sí misma para procesar su contenido.  /**  * Método para eliminar una carpeta y su contenido de forma recursiva.  * @param fileDel El archivo o directorio a eliminar.  */ private void deleteFolder(File fileDel) {     // 1. Si es un directorio....

Guía rápida: Cómo crear y escribir en archivos de propiedades en Java 📂

¡Hola a todos! En el desarrollo de aplicaciones Java, los archivos de propiedades son una herramienta fundamental para gestionar configuraciones de manera flexible y externa al código. A menudo, necesitamos no solo leer estos archivos, sino también escribir o modificar su contenido de forma programática. En esta ocasión, te mostraré una forma rápida de escribir en un archivo de propiedades, añadiendo nuevas entradas o actualizando existentes con valores que pases por parámetros. El método: insertFile La función que te presento a continuación se encarga de recibir el nombre de una propiedad y su valor, y luego los escribe en un archivo. Es crucial entender cómo funciona la escritura en archivos para evitar problemas. /**  * Método para escribir en un archivo de propiedades.  *  * @param output El valor que se va a escribir.  * @param prop El nombre de la propiedad.  */ private static void insertFile(String output, String prop) {     try {     ...

¡Organiza tus datos! 📊 Cómo ordenar objetos por múltiples criterios en Java

¡Hola a todos! Como desarrolladores, a menudo nos enfrentamos a la necesidad de ordenar colecciones de objetos basándonos en uno o más criterios. A diferencia de las listas de datos simples, ordenar objetos personalizados requiere un poco más de trabajo, pero afortunadamente, Java nos ofrece una solución muy elegante para lograrlo. En esta ocasión, te mostraré cómo ordenar una lista de objetos por dos criterios: el nombre del proyecto y el nombre del encargado. La clave es el uso de la interfaz Comparator . La solución: Implementando un Comparator El Comparator es una interfaz que nos permite definir una lógica de comparación personalizada para nuestros objetos. Si necesitas ordenar por múltiples criterios, puedes hacerlo de forma secuencial dentro del método compare . Aquí tienes un ejemplo de cómo ordenar una lista de objetos Tareas : import java.util.Collections; import java.util.Comparator; import java.util.List; // Asumimos que la clase Tareas tiene los métodos getNombreProyecto(...

Dando formato a tus campos de texto en Java Swing 🎨

¡Hola a todos! Cuando desarrollamos aplicaciones de escritorio con Java Swing , a menudo necesitamos asegurarnos de que los usuarios ingresen datos en un formato específico, como números, moneda o porcentajes. Afortunadamente, no tienes que escribir tu propia lógica de validación, ya que JFormattedTextField está diseñado precisamente para esta tarea. En este artículo, te mostraré cómo usar JFormattedTextField para dar formato a tus campos de texto y también cómo procesar esos valores una vez que los obtengas. 1. Formato de entrada con JFormattedTextField El JFormattedTextField es un componente de texto que utiliza un Formatter para dar formato a los datos que el usuario ingresa. Aquí tienes unos ejemplos prácticos: Para texto simple: JFormattedTextField textFormatted = new JFormattedTextField("Texto de ejemplo"); String texto = textFormatted.getText(); Para valores de moneda: // Crea un campo de texto con el formato de moneda por defecto de tu sistema. JFormattedTextField...

Manipulando mensajes SOAP en Java con CXF: Una guía práctica 💻

¡Hola a todos! En el mundo de los servicios web, a menudo necesitamos interactuar con los mensajes SOAP de forma programática. A veces, la lógica de negocio requiere que inspeccionemos o modifiquemos las cabeceras ( headers ) o el cuerpo del mensaje antes de que la solicitud llegue al servicio. Una de las mejores maneras de lograr esto, especialmente con Apache CXF y Spring , es utilizando un Handler (manejador). En este artículo, te mostraré cómo implementar un Handler para interceptar y manipular mensajes SOAP, basándome en un ejemplo funcional y bien estructurado. Paso 1: Crea tu clase HandlerChain Lo primero que haremos es crear una clase Java que implemente la interfaz SOAPHandler . Este es el componente central que interceptará los mensajes. import javax.xml.namespace.QName; import javax.xml.soap.*; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext; import javax.xml.ws.soap.SOAPFaultEx...

¿Error IllegalAnnotationsException en JAXB? ¡Aquí está la solución! 🚫

¡Hola a todos! Si estás trabajando con servicios web en Spring y te has topado con el error com.sun.xml.bind.v2.runtime.IllegalAnnotationsException al desplegar en Tomcat, sé lo frustrante que puede ser. A primera vista, el mensaje de error puede no ser muy claro, especialmente cuando el método parece estar bien. Hace poco me encontré con este mismo problema, y tras una inspección detallada, descubrí que la causa era muy simple pero difícil de notar a primera vista. La clave estaba en la declaración de las variables de la clase de la excepción. El problema: Visibilidad de las propiedades El error IllegalAnnotationsException con el mensaje Class has two properties of the same name ocurre cuando el motor de JAXB (Java Architecture for XML Binding) que usa CXF intenta serializar una clase y encuentra dos "propiedades" con el mismo nombre. Esto puede suceder si declaras una variable de clase con visibilidad public y, además, tienes métodos getter y setter para esa misma ...

Pool de conexiones de Tomcat: Guía para evitar la congestión en la base de datos 💥

¡Hola a todos! Un pool de conexiones es esencial para cualquier aplicación web que interactúa con una base de datos. Su propósito es mantener un conjunto de conexiones abiertas y listas para ser usadas, lo que mejora el rendimiento al evitar el alto costo de abrir y cerrar una conexión por cada solicitud. Sin embargo, una configuración incorrecta puede causar problemas de rendimiento, como bloqueos o lentitud en las respuestas. A continuación, te muestro un ejemplo de configuración de un pool de conexiones para Apache Tomcat usando Spring Framework y el pool DBCP , diseñado para prevenir problemas de congestión. Configuración del pool de conexiones con Spring y DBCP El siguiente código muestra cómo configurar el DataSource en un archivo de configuración de Spring. Este bean es crucial para gestionar el pool de conexiones de manera eficiente. <bean id="connectionPooledDataSource" class="org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS">     <propert...

Búsqueda en arreglos: Arrays.binarySearch vs. un bucle simple 🔎

¡Hola a todos! La búsqueda de un elemento en un arreglo es una tarea muy común en programación. Aunque un bucle for es una forma intuitiva de hacerlo, Java ofrece un método más eficiente y optimizado: Arrays.binarySearch() . En esta entrada, exploraremos las diferencias entre estos dos enfoques y por qué el segundo es casi siempre la mejor opción. La búsqueda manual con un bucle El enfoque con un bucle es sencillo de entender y te da control total sobre el proceso. Funciona recorriendo cada elemento del arreglo hasta encontrar una coincidencia. Aquí está el ejemplo que nos compartes: private int searchString(String[] findArray, String stringSearch) {      int result = -1;      int cant = 0;      for(String stringFounded : findArray){          if(findArray[cant].equals(stringSearch)){              result = cant;          }          ca...

De cadena a entero: Una solución creativa para convertir datos en Java 🔢

¡Hola a todos! A veces, en el desarrollo, nos encontramos con problemas específicos que requieren una solución a medida. Un caso que me sucedió fue la necesidad de convertir una cadena de caracteres a un número entero. El problema es que los métodos de hash estándar a menudo devuelven valores que superan la capacidad de un int . Aquí les comparto un método que creé para solucionar este problema. Aunque no es la solución más óptima, es una forma práctica de obtener un entero a partir de una cadena, manteniendo la consistencia. El método: toInt Este método toma un arreglo de bytes (que puedes obtener fácilmente de una cadena) y lo convierte en un int de 9 dígitos.  public static int toInt(byte[] buffer) {     StringBuilder builder = new StringBuilder();     int result = 0;     for (byte b : buffer) {         // Convierte cada byte a su representación hexadecimal         builder.append(String.format("%02x", b)); ...

Arregla el plugin de Java en tu navegador de Linux ☕

Hola a todos. ¿Alguna vez instalaste el JDK o JRE en Ubuntu y notaste que el plugin de Java no funciona en tu navegador? Este es un problema común, especialmente con Chrome y Firefox, porque la instalación no siempre crea automáticamente los enlaces necesarios para que el navegador reconozca el plugin . Aquí te explico cómo solucionar este problema de forma manual, creando un enlace simbólico al archivo del plugin . 1. Ubica el archivo del plugin de Java Lo primero que necesitas es encontrar el archivo del plugin en tu instalación de Java. El archivo se llama libnpjp2.so . Su ubicación puede variar dependiendo de la versión y la arquitectura de tu sistema (32 o 64 bits). Una ruta de ejemplo podría ser: /home/tu_usuario/Aplicaciones/jdk1.6.0_30/jre/lib/amd64/libnpjp2.so Si no lo encuentras, puedes usar el comando find en la terminal para buscarlo: find / -name "libnpjp2.so" 2>/dev/null 2. Crea enlaces simbólicos en la carpeta de plugins del navegador Una vez que tengas...

Genera hashes MD5 y SHA1 con Apache Ant 📝

Hola a todos. En el desarrollo de software, es común necesitar generar hashes para verificar la integridad de los archivos. Si estás usando Apache Ant para tus proyectos y necesitas generar los hashes MD5 y SHA1 de un archivo .jar al momento de la compilación, te tengo una solución elegante y simple. Aunque existen programas de escritorio para esta tarea, automatizarla con Ant es mucho más eficiente, ya que te permite integrar el proceso directamente en tu flujo de trabajo. La solución en el build.xml La clave es usar la tarea checksum de Ant, que está diseñada para generar sumas de verificación de archivos. Aquí está el código que puedes agregar a tu archivo build.xml : <antcall target="checkSum">     <param name="path" value="<ruta>"/>     <param name="dir" value="<directorio>"/> </antcall> <target name="checkSum">     <basename property="_base" file="${path}...