【问题标题】:Spring boot Jackson dynamic partial responseSpring boot Jackson 动态部分响应
【发布时间】:2016-09-24 19:46:23
【问题描述】:

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

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

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

到目前为止,我已经添加了如下配置,但它在 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 类,这样做会给我带来更多问题。另外,我必须在每个控制器方法处创建对象,并在需要部分响应的地方更改返回类型。

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

【问题讨论】:

    标签: json spring rest serialization jackson


    【解决方案1】:

    基本上,当您扩展 MappingJacksonValue 并设置过滤器时。 例如

    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);
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2019-01-13
      • 2014-12-07
      • 2017-11-04
      • 1970-01-01
      • 2017-03-30
      • 2019-01-15
      • 2017-06-12
      • 2016-05-17
      • 1970-01-01
      相关资源
      最近更新 更多