Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

360
Vistas
La firma del módulo Jackson evita la adición de serializadores para tipos genéricos autorreferenciados

Quiero agregar un serializador y deserializador personalizado para JSR 363 javax.measure.Quantity<Q extends Quantity<Q>> , que básicamente encapsula un "valor" y una "unidad". Crear el serializador ( extends JsonSerializer<Quantity<?>> ) y el deserializador ( extends StdDeserializer<Quantity<?>> ) es fácil.

Pero no es fácil registrarlos. Para deserializadores, está bien; mira la firma:

 SimpleModule.addDeserializer(Class<T> type, JsonDeserializer<? extends T> deser)

Tenga en cuenta que el deserializador permite ampliar el tipo genérico. Entonces puedo hacer esto:

 module.addDeserializer(Quantity.class, new MyQuantityJsonDeserializer());

Pero el serializador es otra historia; mira la firma para su registro:

 SimpleModule.addSerializer(Class<? extends T> type, JsonSerializer<T> ser)

Oh, el dolor que esto causa debido al tipo genérico restringido. No puedo hacer esto:

 module.addSerializer(Quantity.class, new MyQuantityJsonSerializer());

Esto se debe a que Quantity.class nunca me dará un Class<Quantity<Q extends Quantity<Q>> . Y no hay un lanzamiento fácil alrededor de esto, sin introducir alguna variable genérica arbitraria en el método del módulo y usar lanzamientos acrobáticos. Incluso esto no funcionará:

 module.addSerializer((Class<Quantity<?>>) Quantity.class, new MyQuantityJsonSerializer());

Lo mejor que he podido hacer es crear mi clase de serializador QuantityJsonSerializer<Q extends Quantity<Q>> extends JsonSerializer<Q> , y luego en el módulo registrarlo como el tipo sin procesar:

 @SuppressWarnings({"rawtypes", "unchecked"}) final JsonSerializer<Quantity> quantitySerializer = (JsonSerializer<Quantity>) new MyQuantityJsonSerializer(); module.addSerializer(Quantity.class, quantitySerializer);

Uf, ¿qué tan feo es eso? Pero esa es una de las únicas formas que puedo encontrar para que funcione, y tuve que pasar por más gimnasia para eliminar las advertencias.

Seguramente SimpleModule.addSerializer() podría haber sido un poco más flexible en sus parámetros genéricos, de forma análoga a SimpleModule.addDeserializer() .

Estoy reportando esto aquí porque el proyecto Jackson dijo que se reportaran errores aquí --- y también estoy pidiendo mejores ideas para solucionarlos. Gracias.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

En SimpleModule hay una versión sobrecargada de addSerializer() :

 public SimpleModule addSerializer(JsonSerializer<?> ser)

que permite que esto funcione:

 module.addSerializer(new MyQuantityJsonSerializer());

siempre que defina su serializador como:

 public class MyQuantityJsonSerializer extends StdSerializer<Quantity<?>> { public MyQuantityJsonSerializer() { // Note: second argument here is ignored. super(Quantity.class, false); } @Override public void serialize(Quantity<?> value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // Serialize value here... } }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda