弹簧靴杰克逊动态部分反应

时间:2016-05-26 17:04:12

标签: json spring rest serialization jackson

我正在使用Spring-Boot 1.3进行休息服务。在此,我必须根据请求输入参数(e.g. ../employees?opFields=name,emailId,..)中提供的字段(包括)返回部分响应。

我想实现jackson.antpathfilter(一种基于AntPath匹配添加过滤的实现)。我必须添加配置,以便我不需要更改Rest(Controller)的服务方法的返回类型。但是基于特定类的对象实例,使用filter进行序列化else使用正常的序列化。过滤器应仅应用于特定类的实例。

更新 基本上我想实现动态部分响应, 1)从请求中动态检索opField。 2)根据对象类型设置过滤器(可以是antpathbuilder或简单) 3)不改变(休息)控制器方法的返回类型。

截至目前,我已添加如下配置,但它在ExceptionHandler中提供了问题。

@Configuration
public class CustomDispatcherServlet extends WebMvcConfigurerAdapter {

  @Override
  public void configureMessageConverters(final List<HttpMessageConverter<?>> messageConverters) {
    ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().mixIn(Object.class, AntPathFilterMixin.class).build();
    messageConverters.add(new MappingJackson2HttpMessageConverter(objectMapper));
    extendMessageConverters(messageConverters);
  }

}

我正在扩展MappingJacksonValue,如下所示,并使用类对象发送其余呼叫响应,

public class FilteredResponse extends MappingJacksonValue {

  public FilteredResponse(final Object value, final String... opFields) {
    super(value);
    if (null == opFields || opFields.length <= 0) {
      setFilters(new SimpleFilterProvider().addFilter("antPathFilter", new AntPathPropertyFilter("**")));
    } else {
      setFilters(new SimpleFilterProvider().addFilter("antPathFilter", new AntPathPropertyFilter(opFields)));
    }
  }
}

这样做,当对象不是JacksonResponse类时,给我更多问题。另外,我必须在每个控制器方法中创建对象并更改需要部分响应的返回类型。

我们可以动态检查对象实例并设置过滤器。还是其他任何解决方案?

1 个答案:

答案 0 :(得分:2)

基本上,当您扩展MappingJacksonValue并设置过滤器时。 E.g。

public class PartialResponse extends MappingJacksonValue {
  public JacksonResponse(final Object value, final String... filters) {
    super(value);
    if (null == filters || filters.length <= 0) {
      setFilters(new SimpleFilterProvider().addFilter("antPathFilter", new AntPathPropertyFilter("**")));
    } else {
      setFilters(new SimpleFilterProvider().addFilter("antPathFilter", new AntPathPropertyFilter(filters)));
    }
  }
}

在此,如果为PartialResponse.class添加配置,而不是使用Object.class配置对象映射器,则解决问题。

@Configuration
public class CustomDispatcherServlet extends WebMvcConfigurerAdapter {

 @Override
  public void configureMessageConverters(final List<HttpMessageConverter<?>> messageConverters) {
    ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().mixIn(PartialResponse.class, AntPathFilterMixin.class).build();
    messageConverters.add(new MappingJackson2HttpMessageConverter(objectMapper));
extendMessageConverters(messageConverters);
  }

}