Java Bean访问器的Genson缓存

Java Bean访问器的Genson缓存,java,json,caching,genson,Java,Json,Caching,Genson,我最近升级到Genson 1.3,我不能100%确定这个问题是否是新的,因为之前我修补了0.98版本以使其正常工作 上下文 我们正在使用我们自己的BeanMutatorAccessorResolver实现。这样我们就可以动态地决定是否应该序列化属性。基本上,我们已经将Genson集成到我们的通用jersey REST API接口中。Genson负责所有的序列化和反序列化。在执行GET请求时,用户可以在URL中传递字段,以过滤他特别需要的字段(特别是对于大型对象,在仅需要3个左右的字段来显示表概览

我最近升级到Genson 1.3,我不能100%确定这个问题是否是新的,因为之前我修补了0.98版本以使其正常工作

上下文

我们正在使用我们自己的BeanMutatorAccessorResolver实现。这样我们就可以动态地决定是否应该序列化属性。基本上,我们已经将Genson集成到我们的通用jersey REST API接口中。Genson负责所有的序列化和反序列化。在执行GET请求时,用户可以在URL中传递字段,以过滤他特别需要的字段(特别是对于大型对象,在仅需要3个左右的字段来显示表概览的情况下,这是必要的)。例如:?字段=字段1、字段2、字段3。然后,在BeanMutatorAccessorResolver的实现中,我们知道哪些字段要序列化,哪些字段要忽略。这主要是为了加速请求和解析,因为我们使用的数据更少

问题

不幸的是,一旦Genson通过反射或其他方式读取了所有字段,它就会缓存这些字段。如果我们总是请求相同的字段,这将不会有问题。不幸的是,在某些情况下,我们需要比以前更多的字段,但由于Genson没有第二次访问BeanMutatorAccessorResolver,因此它只返回已经缓存的少数字段

这有什么关系吗?也许有一个更好的解决方案,而不是完全关闭cahing,因为这很可能会损害性能,对吗

更新

似乎我已经找到了发生这种情况的地点。基本上Genson在Genson.provideConverter(类型forType)(第154行)中返回一个缓存的转换器


我应该设置这个值还是有更好的解决方案?

多亏了Eugen,问题已经解决了。可以在此处找到解决方案:

基本上,您需要扩展3个类来实现此功能:

  • GensonBundle,您可以向GensonBuilder注册
  • BaseBeandDescriptorProvider,它在GensonBundle中创建
  • BeanDescriptor,在BaseBeanDescriptorProvider和 它包含序列化方法以适应您的需要

  • 不幸的是,在我的Jersey资源类中添加行“ThreadLocalHolder.store(“\uu GENSON$DO\u NOT\u CACHE\u CONVERTER”,true);”似乎也没有帮助。
    Converter<T> converter = (Converter<T>) converterCache.get(forType);
    
    if (Boolean.TRUE.equals(ThreadLocalHolder.get("__GENSON$DO_NOT_CACHE_CONVERTER", Boolean.class))) {