Pedro Silva
Pedro Silva

Reputation: 470

How to ignore "null" or empty properties in json, globally, using Spring configuration

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.

Upvotes: 13

Views: 26952

Answers (4)

António Ribeiro
António Ribeiro

Reputation: 4202

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

EDIT:

If, instead of application.properties one is relying on application.yml, then the following configuration should be used:

spring:
    jackson:
        default-property-inclusion: non_null

Upvotes: 7

JRA_TLL
JRA_TLL

Reputation: 1361

In newer versions of Spring Boot (2.0+), use:

spring.jackson.default-property-inclusion=non_null

Upvotes: 7

Abolfazl Hashemi
Abolfazl Hashemi

Reputation: 764

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>

Upvotes: 4

Jon Peterson
Jon Peterson

Reputation: 2996

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);
            }
        }
    }
}

Upvotes: 26

Related Questions