java - jsonserialize - Deserializador de Jackson: cambie la colección nula para vaciar uno
jsonserializer jackson (1)
Tengo una entidad que contiene la colección como atributo:
public class Entity {
@JsonProperty(value="homes")
@JsonDeserialize(as=HashSet.class, contentAs=HomeImpl.class)
private Collection<Home> homes = new ArrayList<Home>();
}
Si la solicitud contiene nulo como propiedad de solicitud:
{
"homes": null
}
entonces las casas están configuradas como nulas. Lo que quiero hacer es establecer hogares en la lista vacía. ¿Debo escribir un deserializador especial para esto o hay uno para colecciones? Lo que probé es este deserializador, pero se ve feo (no es genérico y usa implementación en lugar de interfaz).
public class NotNullCollectionDeserializer extends JsonDeserializer<Collection<HomeImpl>> {
@Override
public Collection<HomeImpl> deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
return jsonParser.readValueAs(new TypeReference<Collection<HomeImpl>>(){});
}
@Override
public Collection<HomeImpl> getNullValue() {
return Collections.emptyList();
}
}
Muy pocas preguntas:
- ¿Hay alguna propiedad de jackson que cambie null a la colección vacía durante la deserialización?
- Si no es por el primer punto, ¿necesito escribir un deserializador para esto? Si es así, ¿puedo escribir uno genérico?
Tampoco pude encontrar una propiedad o anotación de Jackson para esto. Así que tendré que responder no a la primera pregunta. Pero recomendaría un setter simple en lugar del deserializador especial:
public class Entity {
@JsonDeserialize(contentAs = HomeImpl.class)
private Collection<Home> homes = new ArrayList<>();
public void setHomes(List<Home> homes) {
if (homes != null)
this.homes = homes;
}
}
Esto es genérico ya que solo usa la interfaz de Home
en lugar de HomeImpl
. No necesita @JsonProperty
ya que Jackson asociará setHomes
y homes
.