繁体   English   中英

在 Jersey 2 中调用代理对象的包私有方法的奇怪行为

[英]Strange behavior calling package-private method of proxied object in Jersey 2

下课

public class MaskHolder {

    private Mask mask;
    private UUID id = UUID.randomUUID()

    void store() {
        System.out.println(id);
    }

    public void get() {
        System.out.println(id);
    }

}

像这样绑定到HK2

bind(MaskHolder.class).to(MaskHolder.class)
            .proxy(true).proxyForSameScope(false).in(RequestScoped.class);

使用 @Context 注入到 bean 的代理对于公共方法的行为与预期的一样,但也执行包私有方法。 问题是 package-private 方法不会触发 MethodInterceptor 所以它实际上没有达到 get() 所达到的相同实例。 问题是代理将包私有方法调用转发到的这个“默认”实例是什么。 调用 get() 方法时,我会根据不同的请求到达不同的实例,但调用 store 方法每次都会在同一个实例中结束,因此它的行为类似于单例。

还有一件事我没有提到 - 代理行为像单例一样被注入到JacksonJsonProvider子类中。 据我所知,JacksonJsonProvider 的这个子类在 Jersey 中仅创建一次,因此注入其中的代理实例不会在请求之间发生变化。

Proxy 基本上是MaskHolder的人工子类,在公共方法上具有拦截器,但它基本上是MaskHolder及其 UUID 字段。 因此,如果拦截器不提供 RequestScope bean,我们将访问“父”MaskHolder。 而且因为代理实例只注入一次 JacksonJsonProvider 它在请求之间是相同的。

MaskHolder注入资源会导致请求中出现不同的代理实例(不同的 UUID)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM