【问题标题】:JsonFilter throws error "no FilterProvider configured for id"JsonFilter 抛出错误“没有为 id 配置 FilterProvider”
【发布时间】:2021-05-12 20:05:54
【问题描述】:

在 Spring Boot 框架中开发的 web 服务中,我正在寻找一种方法来过滤响应中的几个敏感字段。我正在尝试使用 JsonFilter。这是我到目前为止尝试过的代码:

@ApiModel (value = "Customer")
@JsonInclude (JsonInclude.Include.NON_NULL)
@JsonFilter("CustomerFilter")
public class Customer implements Serializable
{
...
}

发送过滤响应的控制器代码:

MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(customer);
FilterProvider filters = new 
  SimpleFilterProvider().setFailOnUnknownId(false).addFilter("CustomerFilter", 
  SimpleBeanPropertyFilter.filterOutAllExcept("customerId"));        
mappingJacksonValue.setFilters(filters);
return ResponseEntity.status(HttpStatus.OK).body(mappingJacksonValue);

调用请求时,抛出以下异常。 com.fasterxml.jackson.databind.JsonMappingException:无法解析 ID 为“CustomerFilter”的 PropertyFilter;没有配置 FilterProvider

我是否缺少任何配置?

【问题讨论】:

  • 我也有同样的问题。

标签: json spring-boot jackson


【解决方案1】:

这周我遇到了同样的问题,现在通过在我的配置文件夹中创建一个 FilterConfiguration 类来解决它。

@JsonFilter("studentFilter")
public class Student {
    String name;
    String password;

    public Student() {
        this.name = "Steve";
        this.password = "superSecretPassword";
    }
}


@Configuration
public class FilterConfiguration {
    public FilterConfiguration (ObjectMapper objectMapper) {
        SimpleFilterProvider simpleFilterProvider = new SimpleFilterProvider().setFailOnUnknownId(true);
        simpleFilterProvider.addFilter("studentFilter", SimpleBeanPropertyFilter.filterOutAllExcept("name"));

        objectMapper.setFilterProvider(simpleFilterProvider);
    }
}

当我创建一个新学生时,密码被过滤掉了。

【讨论】:

    【解决方案2】:

    避免使用 MappingJacksonValue,因为它在对象链接中失败并提供像 ["data"]->org.springframework.http.converter.json.MappingJacksonValue["value"]->java.util.ArrayList[0]) 这样的错误

    注意:使用 ObjectMapper 和 ObjectWriter 代替 MappingJacksonValue

    试试下面的代码 sn-p

            ObjectMapper mapper = new ObjectMapper();
            mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
            FilterProvider filters = new SimpleFilterProvider().setFailOnUnknownId(false).addFilter("CustomerFilter",
                    SimpleBeanPropertyFilter.filterOutAllExcept("customerId"));
            ObjectWriter writer = mapper.writer(filters);
            String writeValueAsString = writer.writeValueAsString(customer);
            Customer resultCustomer = mapper.readValue(writeValueAsString, Customer.class);
            return ResponseEntity.status(HttpStatus.OK).body(resultCustomer);
    

    【讨论】:

      猜你喜欢
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2012-03-12
      • 1970-01-01
      • 2022-06-17
      • 2021-07-08
      相关资源
      最近更新 更多