EN · DE · RU · FR · ES

#759: XmlOmitField.java

projectforge-business/src/main/java/org/projectforge/framework/xmlstream/XmlOmitField.java Anotación marcadora Java — excluye un campo de la serialización XML de XmlStream. Fuente: projectforge-business/src/main/java/org/projectforge/framework/xmlstream/XmlOmitField.java 39 líneas · 9 código · 26 comentarios · 4 en blanco
Propósito: Una anotación marcadora sin parámetros que indica al framework XmlStream que omita un campo durante la serialización y deserialización XML. Es el equivalente de XmlStream a la palabra clave transient de Java y a @XmlTransient de JAXB, pero limitado exclusivamente al framework XmlStream de ProjectForge — dejando el campo intacto para la serialización Java, la persistencia JPA y otros subsistemas.

Arquitectura

La anotación en sí es mínima — 3 líneas de código, @Target(FIELD), @Retention(RUNTIME). Su poder proviene de los consumidores que verifican su presencia:

XmlObjectWriter.writeField() (#758, línea ~242): if (field.isAnnotationPresent(XmlOmitField.class)) continue;
XmlObjectReader.read() (#757, línea ~471): omite los campos anotados con @XmlOmitField durante la deserialización

No hay lógica en la anotación misma — es un marcador puro consumido de forma reflectiva por el par lector/escritor.

¿Por qué una anotación separada en lugar de transient?

La palabra clave transient de Java excluye un campo de todos los mecanismos de serialización — Serialización Java, XStream, XmlStream, mapeadores JSON, todo. Esto suele ser demasiado amplio:

Escenario: Un campo como computedHash debería almacenarse en caché en la sesión HTTP (serialización Java) pero no debe aparecer en exportaciones XML (derrochador, engañoso).

Solución: Hacer que el campo no sea transitorio (para que participe en la serialización de sesión Java) y anotarlo con @XmlOmitField (para que XmlStream lo omita). Esto proporciona un control por framework sobre la visibilidad de la serialización.

Ejemplo de seguridad: password en PFUserDO. El campo es transient (seguridad de sesión) Y está anotado con @XmlOmitField (seguridad XML). Incluso si alguien elimina transient para depuración, la anotación proporciona una segunda barrera que evita que las contraseñas se filtren en las exportaciones XML.

Contraste con @XmlField(defaultValue=...)

MecanismoCuando se omite el campoCaso de uso
@XmlOmitFieldSiempre — independientemente del valorContraseñas, campos calculados, estado temporal, datos sensibles
@XmlField(defaultIntValue=0)Condicionalmente — solo cuando el valor es igual al predeterminadoOptimización de tamaño: omitir valores cero, cadenas vacías, nulos
La diferencia es semántica: @XmlOmitField dice "este campo no tiene nada que hacer en XML", mientras que @XmlField(defaultValue=...) dice "este campo a veces es redundante — omítelo cuando lo sea". Uno es una política estricta, el otro es una optimización suave.

Historial de Git

868d6abb7 2025 → 2026 (actualización de año de copyright)
63081666f Encabezados de archivos fuente: 2024→2025
b6092df09 Copyright 2023 → 2024
ab45d51fa Copyright 2001-2022 → 2001-2023
5f7ef41b8 Copyright 2021 → 2022
cd27dd997 paquete xstream → xmlstream (renombrado para evitar confusión con la librería XStream)
ceb63e8a1 Encabezado de código fuente: (C) 2001-2021
7c79f1922 Copyright del encabezado fuente → 2020
32f634b88 Optimizar importaciones
dd5ca38ac Copyright de todos los encabezados de archivos Java actualizado o creado
9ebb88522 Commit inicial
La anotación ha permanecido sin cambios desde el commit inicial — solo los encabezados de copyright y un cambio de nombre de paquete (xstreamxmlstream). Esta estabilidad refleja su diseño: una anotación marcadora sin parámetros no tiene partes móviles que puedan romperse. El único cambio significativo fue cd27dd997 que renombró el paquete de xstream a xmlstream para evitar colisión de nombres con la librería XStream (com.thoughtworks.xstream).

Trío de anotaciones XmlStream

AnotaciónArchivoRol
@XmlField#755Declara un campo para serialización con nombre, tipo, valor predeterminado, formato, orden
@XmlObject#756Declara una clase como serializable en XML con alias
@XmlOmitField#759Excluye un campo de la serialización por completo
Juntas, estas tres anotaciones forman la superficie de configuración completa del framework XmlStream. @XmlObject habilita una clase para serialización, @XmlField configura campos individuales, y @XmlOmitField deshabilita campos selectivamente. Esto es más simple que JAXB (que tiene ~20 anotaciones) y más explícito que el enfoque de convención pura de XStream.