java - example - Establecer los valores predeterminados para null campos al mapear con Jackson
objectmapper java (5)
Haga que el miembro sea privado y agregue un par de setter / getter. En su setter, si es nulo, entonces configure el valor predeterminado en su lugar. Además, he mostrado el fragmento con el getter que también devuelve un valor predeterminado cuando el valor interno es nulo.
class JavaObject {
private static final String DEFAULT="Default Value";
public JavaObject() {
}
@NotNull
private String notNullMember;
public void setNotNullMember(String value){
if (value==null) { notNullMember=DEFAULT; return; }
notNullMember=value;
return;
}
public String getNotNullMember(){
if (notNullMember==null) { return DEFAULT;}
return notNullMember;
}
public String optionalMember;
}
Estoy tratando de asignar algunos objetos JSON a objetos Java con Jackson. Algunos de los campos en el objeto JSON son obligatorios (que puedo marcar con @NotNull
) y algunos son opcionales.
Después del mapeo con Jackson, todos los campos que no están establecidos en el objeto JSON tendrán un valor nulo en Java. ¿Hay alguna anotación similar a @NotNull
que le @NotNull
a Jackson que establezca un valor predeterminado para un miembro de la clase Java, en caso de que sea nulo?
Editar: para hacer la pregunta más clara aquí hay un ejemplo de código.
El objeto de Java:
class JavaObject {
@NotNull
public String notNullMember;
@DefaultValue("Value")
public String optionalMember;
}
El objeto JSON puede ser:
{
"notNullMember" : "notNull"
}
o:
{
"notNullMember" : "notNull",
"optionalMember" : "optional"
}
Las anotaciones de @DefaultValue
son solo para mostrar lo que estoy pidiendo. No es una anotación real. Si el objeto JSON es como en el primer ejemplo, quiero que el valor de optionalMember
sea "Value"
y no null
. ¿Hay alguna anotación que haga tal cosa?
No hay anotación para establecer el valor predeterminado.
Puede establecer el valor predeterminado solo en el nivel de clase java:
public class JavaObject
{
public String notNullMember;
public String optionalMember = "Value";
}
Parece que la solución es establecer el valor de las propiedades dentro del constructor predeterminado. Entonces, en este caso, la clase java es:
class JavaObject {
public JavaObject() {
optionalMember = "Value";
}
@NotNull
public String notNullMember;
public String optionalMember;
}
Después del mapeo con Jackson, si optionalMember
falta en el JSON, su valor en la clase Java es "Value"
.
Sin embargo, todavía estoy interesado en saber si hay una solución con anotaciones y sin el constructor predeterminado.
Solo una solución propuesta mantiene el default-value
cuando se establece explícitamente some-value:null
(la legibilidad POJO se pierde allí y es torpe)
Así es como uno puede mantener el default-value
y nunca establecerlo como null
@JsonProperty("some-value")
public String someValue = "default-value";
@JsonSetter("some-value")
public void setSomeValue(String s) {
if (s != null) {
someValue = s;
}
}
Tuve un problema similar, pero en mi caso el valor predeterminado estaba en la base de datos. Debajo está la solución para eso:
@Configuration
public class AppConfiguration {
@Autowired
private AppConfigDao appConfigDao;
@Bean
public Jackson2ObjectMapperBuilder builder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
.deserializerByType(SomeDto.class,
new SomeDtoJsonDeserializer(appConfigDao.findDefaultValue()));
return builder;
}
Luego, en SomeDtoJsonDeserializer
use ObjectMapper
para deserializar el json y establecer el valor predeterminado si su campo / objeto es nulo.