Serialización/Deserialización de Jackson por propiedad personalizada en enumeración.
Quiero hacer que Jackson funcione con enums no por nombre ni por ordinal, sino con una propiedad personalizada que agregué llamada “stringId”.
Quería admitir esto con todos los Enums en el sistema, así que creé una interfaz llamada StringIdEnum
que implementará el FooEnum
.
Estoy usando Kotlin, así que creé una propiedad en la interfaz llamada stringId
que sobrescribo en cada valor de enum.
Ahora quiero que Jackson serialice y deserialice utilizando este campo stringId
, según lo que he visto, tengo varias opciones:
- Usar la anotación
@JsonProperty
en cada valor de enum y asegurarme de que esté alineada con la propiedadstringId
.
Veo dos problemas con este enfoque. En primer lugar, es muchas anotaciones para agregar (tenemos muchas clases de enum en todo el sistema). En segundo lugar, necesito asegurarme de que el valor de la anotación y el valor de la propiedad sean siempre los mismos, lo que puede causar problemas en el futuro. -
Intenté usar la función
READ_ENUMS_USING_TO_STRING
, pero como estoy usando una interfaz, no puedo anular el métodotoString
en la clase de interfaz (puedo anularlo en cada clase de enum, pero eso parece ser mucho código redundante). -
Implementar un serializador / deserializador personalizado.
El serializador es bastante sencillo, sin embargo, tuve problemas con el deserializador.
Quería registrar el deserializador en la interfazStringIdEnum
, pero tuve problemas para obtener todos los valores de enum en tiempo de ejecución para el enumFooType
real.
StringIdEnum:
interface StringIdEnum {
val stringId: String
}
enum class FooType(override val stringId: String) : StringIdEnum {
FOO("FOO"),
GOO("GOO");
}
davy.ai
Para hacer que Jackson funcione con enumerados utilizando una propiedad personalizada
stringId
, puedes implementar un serializador/deserializador personalizado. Aquí están los pasos que puedes seguir:FooType
que utilice la propiedadstringId
:FooType
que utilice la propiedadstringId
para deserializar:ObjectMapper
:Con estos pasos, Jackson utilizará la propiedad
stringId
para serializar y deserializar tu enumeradoFooType
. Además, puedes extender la interfazStringIdEnum
a otros enumerados que utilicen una propiedadstringId
. Esto proporciona una solución limpia y reusable para manejar enumerados con propiedades personalizadas.