【问题标题】:Spring RestTemplate with Jackson throws "Can not resolve BeanPropertyFilter" when using @JsonFilter使用 @JsonFilter 时,带有 Jackson 的 Spring RestTemplate 抛出“无法解析 BeanPropertyFilter”
【发布时间】:2012-03-12 21:56:59
【问题描述】:

我可以指定 Spring 的 RestTemplate 使用的 Jackson ObjectMapper 吗?

我不是 100% 这就是我需要做的,但请参阅下面的详细信息。

背景:this StackOverflow post 的帮助下,我将@JsonFilter 添加到我的域类并编辑了我的jax-rs Web 服务(在CXF 中实现)。我现在能够成功地动态选择要在我的 RESTful API 中返回的域类字段。到目前为止一切顺利。

我在我的 JUnit 测试中使用 Spring 的 RestTemplate 来测试我的 RESTful API。在我将 @JasonFilter 添加到我的域类之前,这一切正常。现在我得到以下异常:

org.springframework.web.client.ResourceAccessException:I/O 错误:无法解析带有 id 'apiFilter' 的 BeanPropertyFilter;未配置 FilterProvider;嵌套异常是 org.codehaus.jackson.map.JsonMappingException: Can not resolve BeanPropertyFilter with id 'apiFilter';没有配置 FilterProvider

在 org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:453)

为简洁起见省略了其余的堆栈跟踪

原因:org.codehaus.jackson.map.JsonMappingException: Can not resolve BeanPropertyFilter with id 'apiFilter';没有配置 FilterProvider

在 org.codehaus.jackson.map.ser.BeanSerializer.findFilter(BeanSerializer.java:252)

我在服务器端遇到了类似的问题,并且能够通过将FilterProvider 提供给 Jackson ObjectMapper 来解决它(在 this post 的帮助下),如下所示:

ObjectMapper mapper = new ObjectMapper();
FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter", SimpleBeanPropertyFilter.filterOutAllExcept(filterProperties));

我可以在 RestTemplate 端做类似的事情吗?任何有关如何解决此问题的想法都值得赞赏。

需要明确的是,在客户端 RestTemplate 端,我根本不想过滤域对象属性。

【问题讨论】:

    标签: spring jackson


    【解决方案1】:

    我可以指定 Spring 的 RestTemplate 使用的 Jackson ObjectMapper 吗?

    通过执行以下操作,我能够强制 RestTemplate 使用自定义的 ObjectMapper:

    ObjectMapper mapper = new ObjectMapper();
    
    // set a custom filter
    Set<String> filterProperties = new HashSet<String>();
    FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter", SimpleBeanPropertyFilter.serializeAllExcept(filterProperties));
    mapper.setFilters(filters);
    
    MappingJacksonHttpMessageConverter messageConverter = new MappingJacksonHttpMessageConverter();
    messageConverter.setObjectMapper(mapper);
    List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
    messageConverters.add(messageConverter);
    restTemplate.setMessageConverters(messageConverters);
    

    This website 提供了上述部分代码的示例。

    【讨论】:

    • 请提供 MappingJacksonHttpMessageConverter 类
    猜你喜欢
    • 2012-03-12
    • 1970-01-01
    • 2011-11-30
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多