I'm trying to return only the properties that have values, but the null ones are also being returned.
I know that there's an annotation that does this ( @JsonInclude(Include.NON_NULL)
), but then I need these in every single entity class.
So, my question is: Is there a way to configure this globally through spring config? (avoiding XML, preferably)
EDIT: It seems that this question has been considered a duplicate, but I don't think so. The real question here is how to configure it through spring config, which I couldn't find in other questions.
You can ignore null fields at the class level by using @JsonInclude(Include. NON_NULL) to only include non-null fields, thus excluding any attribute whose value is null. You can also use the same annotation at the field level to instruct Jackson to ignore that field while converting Java object to json if it's null.
In order to ignore null fields at the class level, we use the @JsonInclude annotation with include. NON_NULL.
To ignore individual properties, use the [JsonIgnore] attribute. You can specify conditional exclusion by setting the [JsonIgnore] attribute's Condition property. The JsonIgnoreCondition enum provides the following options: Always - The property is always ignored.
Just use this @JsonSerialize(include = Inclusion. NON_NULL) instead of @JsonInclude(Include. NON_NULL) and it works..!!
In newer versions of Spring Boot (2.0+), use:
spring.jackson.default-property-inclusion=non_null
If you are using Spring Boot, this is as easy as:
spring.jackson.serialization-inclusion=non_null
If not, then you can configure the ObjectMapper in the MappingJackson2HttpMessageConverter like so:
@Configuration
class WebMvcConfiguration extends WebMvcConfigurationSupport {
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for(HttpMessageConverter converter: converters) {
if(converter instanceof MappingJackson2HttpMessageConverter) {
ObjectMapper mapper = ((MappingJackson2HttpMessageConverter)converter).getObjectMapper()
mapper.setSerializationInclusion(Include.NON_NULL);
}
}
}
}
The programmatic alternative to Abolfazl Hashemi's answer is the following:
/**
* Jackson configuration class.
*/
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper buildObjectMapper() {
return new ObjectMapper().setSerializationInclusion(Include.NON_NULL);
}
}
This way, you're basically telling to the Spring container that, every time an ObjectMapper
is used, only properties with non-null values are to be included in the mappings.
Another alternative, as per the Spring Boot documentation, for Jackson 2+, is to configure it in the application.properties
:
spring.jackson.default-property-inclusion=non_null
If you use jackson ObjectMapper for generating json, you can define following custom ObjectMapper for this purpose and use it instead:
<bean id="jacksonObjectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="serializationInclusion">
<value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
</property>
</bean>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With