jsonview - jackson spring mvc
Serialización personalizada Jackson bajo Spring 3 MVC (1)
El problema es que Jackson no ve las anotaciones en getItems()
si se trata de un método de punto final de servicio; por lo general, solo se pasa el tipo List<Item>
que determina Spring. Con JAX-RS (como Jersey), las anotaciones asociadas con ese método se pasan, sin embargo (y quizás Spring también lo haga de alguna manera); aunque luego requiere un poco más de soporte del código de integración (para JAX-RS, módulo de proveedor Jackson JAX-RS JSON) para pasar eso.
Puede ser más fácil crear un POJO por separado (y no pasar los tipos de List
) para que pueda agregar las anotaciones necesarias.
Si usaba Jackson directamente, también podría usar ObjectWriter
y especificar el formato de fecha predeterminado para usar. Pero no sé si Spring te permite hacer eso (la mayoría de los frameworks no lo hacen y solo exponen la configurabilidad de ObjectMapper
).
Una nota más: en lugar del serializador personalizado (y / o deserializador), también puede usar anotaciones simples con Date
s (y en Jackson 2.x):
public class DateStuff {
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="''Date:''yyyy''-''MM''-''dd")
public Date date;
}
para especificar la anulación de formato por propiedad.
Tengo un par de POJO que se ve así:
class Items {
List<Item> items;
public List<Item> getItems() {
return items;
}
...
}
class Item {
String name;
Date insertionDate;
...
}
Quiero poder serializar el campo Date
en Item
usando un formato personalizado (agregue un prefijo a la fecha, algo así como "Fecha: xxx"), pero no quiero hacer eso siempre (ya que es usado por otros consumidores) que no requieren este prefijo), solo en casos específicos.
Si getInsertionDate()
la getInsertionDate()
con @JsonSerialize(using = CustomDateSerializer.class)
probablemente pueda hacer que esto funcione, sin embargo , no quiero hacer eso ya que no siempre quiero serializar este campo usando este método , solo en un caso específico.
Entonces, idealmente, haría esto en mi controlador que no quiere personalizar la serialización:
@JsonSerialize(using = CustomDateSerializer.class)
public List<Item> getItems() {
....
}
donde CustomDateSerializer extends SerializerBase<Date>
y Jackson se daría cuenta de que debe serializar cada elemento en la List
usando el serializador predeterminado, y cuando golpea un objeto Date
debe usar mi serializador personalizado. Por supuesto, esto no funciona, ya que no es así como se usa @JsonSerialize
, pero ¿hay alguna manera de hacer que esto funcione que no sea envolver el Item
con un contenedor y usar ese contenedor cuando quiero la serialización personalizada? ¿Estoy pensando en esto de la manera incorrecta y hay otra manera de hacer esto?
Tenga en cuenta que estoy usando Spring MVC, así que no estoy llamando a la serialización directamente.
Cualquier ayuda sería muy apreciada :)