首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jersey 2中调用代理对象的package-private方法的奇怪行为

Jersey 2中调用代理对象的package-private方法的奇怪行为
EN

Stack Overflow用户
提问于 2019-11-29 05:29:33
回答 1查看 77关注 0票数 0

下面的类

代码语言:javascript
复制
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,如下所示

代码语言:javascript
复制
bind(MaskHolder.class).to(MaskHolder.class)
            .proxy(true).proxyForSameScope(false).in(RequestScoped.class);

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-07 17:48:28

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59096350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档