Mirlo24X
Mirlo24X

Reputation: 37

How to create a global filter in able to support @JsonFilter annotated POJO

i'm facing a problem during creating a simple filter using SimpleFilterProvider

Can not resolve PropertyFilter with id 'customerFilter'; no FilterProvider configured

My code is :

SimpleFilterProvider simpleFilterProvider = new SimpleFilterProvider().setFailOnUnknownId(false);
FilterProvider filters =simpleFilterProvider.addFilter("customerFilter", SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames)); 
ObjectWriter writer=null;
ObjectMapper mapper = new ObjectMapper();
mapper.setFilterProvider(filters);
writer=mapper.writer();
String dtoAsString = writer.writeValueAsString(customer);

My POJO is Customer

import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonFilter("customerFilter") 
public class Customer {

    public Customer() {

    }

    public Customer(String customerId,String phoneNumber) {

        this.customerId=customerId;
        this.phoneNumber=phoneNumber;
    }

    /**
     * customer identifier
     */
    @JsonPropertyDescription("customer identifier")
    @JsonProperty("customerId")
    private String customerId;

    /**
     * customer phone number
     */
    @JsonPropertyDescription("customer phone number")
    @JsonProperty("phoneNumber")
    private String phoneNumber;
....

Any help please considering that my app is an SpringBoot app !

Upvotes: 1

Views: 4569

Answers (1)

mp31415
mp31415

Reputation: 6689

If you serialize your Customer object (e.g. in RestController) manually (exactly as you coded) it works fine (see method getManual below). However relying on Spring object mapper requires registering additional filter provider (without it method getAuto fails):

@RestController
@RequestMapping("/customer")
public class CustomerController {

    private static final Set<String> ignorableFieldNames= new HashSet<>();

    static {
        ignorableFieldNames.add("customerId");
    }

    @RequestMapping("auto")
    public Customer getAuto() throws JsonProcessingException {
        return new Customer("123", "456");
    }

    @RequestMapping("manual")
    public String getManual() throws JsonProcessingException {
        SimpleFilterProvider simpleFilterProvider = new SimpleFilterProvider().setFailOnUnknownId(false);
        FilterProvider filters = simpleFilterProvider.addFilter("customerFilter", SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames));

        ObjectWriter writer = null;
        ObjectMapper mapper = new ObjectMapper();
        mapper.setFilterProvider(filters);
        writer = mapper.writer();

        Customer customer = new Customer("123", "456");
        String dtoAsString = writer.writeValueAsString(customer);
        return dtoAsString;
    }
}

Registering your custom filter:

@Component
public class CustomerFilterConfig {
    private static final Set<String> ignorableFieldNames = new HashSet<>();

    static {
        ignorableFieldNames.add("phoneNumber");
    }

    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();

        SimpleFilterProvider simpleFilterProvider = new SimpleFilterProvider().setFailOnUnknownId(false);
        FilterProvider filters = simpleFilterProvider.addFilter("customerFilter", SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames));
        objectMapper.setFilterProvider(filters);

        jsonConverter.setObjectMapper(objectMapper);
        return jsonConverter;
    }    
}

Upvotes: 3

Related Questions