【问题标题】:Can i access request parameter in jackson BeanSerializerModifier?我可以访问杰克逊 BeanSerializerModifier 中的请求参数吗?
【发布时间】:2015-11-07 10:07:20
【问题描述】:

我正在使用 Jersey 来实现 rest api 和 Jackson 来提供 JSON 支持。我试图通过覆盖BeanSerializerModifier.changeProperties 方法在序列化之前删除某些属性。

但删除属性将基于查询参数。有什么方法可以在我的实现中访问查询参数?

【问题讨论】:

  • 您使用的是哪个 Jersey 版本?
  • 我使用的是 Jersey 2.6。我可以利用 ThreadLocal 将查询参数信息共享给外部资源吗?
  • 如果您可以切换到更高版本(不确定,2.17 还是 2.19),Jackson 支持 Entity Data Filtering。支持查询参数过滤
  • True.. 我们评估了实体数据过滤功能和一些支持的 JAR 需要 JDK 1.7,出于某种原因我们需要坚持使用 JDK 1.6。所以我们排除了这个选项。
  • 实体过滤从 2.3 开始可用,但最初它只支持 MOXy。如果您查看文档的底部,您会发现它是可扩展的。 Jersey 稍后使用这种可扩展性为 Jackson 提供支持。如果您想尝试将自己融入到 2.6 中,您可以查看provider used 以在以后的版本中实现此功能

标签: jersey jackson


【解决方案1】:

使用BeanSerializerModifier 本身会变得复杂,因为该方法仅在第一次构造JsonSerializer 时才被调用一次。至于传递查询参数,您可以使用上下文属性和ObjectWriter(由ObjectMapper 构造)传递它们,但这意味着从 Jersey 接管相当多的序列化自动化。

有一种机制可以在不接管整个过程的情况下有助于修改序列化方面:注册ObjectWriterModifier,使用ObjectWriterInjector。这些是 Jackson JAX-RS 提供程序的一部分,在 Jackson 2.3 中添加。在不知道更多细节的情况下,我不知道这有多容易;部分问题在于查询参数更多是输入端的东西,因此无法从输出处理端直接访问它们。

【讨论】:

  • 谢谢。但我使用的是 Jackson 2.2 :(
  • 您好,我想了解 BeanSerializerModifier 的行为,所以在第一次创建序列化对象的过程中会调用 BeanSerializerModifier 并缓存该对象。对于后续请求,不会创建对象(它将从缓存中提供服务),因此不会调用 BeanSerializerModifier?非常感谢。
  • @Mkm 正确。在初始调用之后,只会调用您构造的序列化程序。
  • 谢谢。这就是我在实现中发现的,基本上我保留了更改 BeanSerializerModifier.changeProperties() 内部属性的逻辑,认为这将在序列化之前一直被调用。现在我改变了我的实现如下
  • 现在我已经改变了我的实现如下 public class CustomBeanPropertyWriter extends BeanPropertyWriter { private final BeanPropertyWriter beanPropertyWriterObj; protected CustomBeanPropertyWriter(final BeanPropertyWriter base) { super(base); this.beanPropertyWriterObj = base; } @Override public void serializeAsField(final Object bean, final JsonGenerator jgen, final SerializerProvider prov) throws Exception { if(这个属性可以序列化) {super.serializeAsField(bean, jgen, prov); } } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 2017-09-05
  • 2011-12-24
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
相关资源
最近更新 更多