Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

363
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda