Reputation: 37
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
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