【问题标题】:Seam 2.2 change injected field value using reflectionSeam 2.2 使用反射改变注入的场值
【发布时间】:2012-11-06 15:56:44
【问题描述】:

我使用 Seam 2.2。我想使用反射从 Seam 组件中获取一个私有字段。 所以我有:

    LocalizationEditActionRoot localizationEditActionRoot = (LocalizationEditActionRoot) Component
                        .getInstance(LocalizationEditActionRoot.class, true);
    Class currentClass = localizationEditActionRoot.getClass();
    WebDavMockClient mockClient = new WebDavMockClient();
    Field f = currentClass.getDeclaredField("davClient");
    f.setAccessible(true);
    f.set(localizationEditActionRoot, mockClient);

如果我想获得一个名为 davClient(WebDavClient) 的字段,我会收到 NoSuchFieldException。该领域当然是注入。如果我尝试这样的事情:

    Class currentClass = Class.forName("fr.isiom.bpms.admin.session.ext.action.root.LocalizationEditActionRoot");
    WebDavMockClient mockClient = new WebDavMockClient();
    Field f = currentClass.getDeclaredField("davClient");
    f.setAccessible(true);
    f.set(localizationEditActionRoot, mockClient);

我得到了davClient 字段,但值没有改变。他仍然是 WebDavClient 的实例,而不是 WebDavMockClient。如何更改该字段值?

【问题讨论】:

  • “我得到了字段 davClient 但值没有改变”是什么意思?请记住,注入发生在方法调用周围,因此它可能不适合反射。
  • 您使用的是 POJO 还是 EJB?稍后请确保您不是在处理代理或接口而不是某些实现。

标签: java reflection seam seam2


【解决方案1】:

我还没有设法通过反射来做到这一点。相反,我找到了一个更简单的想法/解决方案。 在我的测试类中,在 Create/setUp 方法中,我从 Seam Context 获取 sessionContext,并将 webDavClient 名称更改为与 WebDavMockClient 而不是 WebDavClient 绑定。这就是你如何用一条线来解决整个问题:

// Setting webDavClient to be injected by seam as WebDavMockClient to mock the actual delete
Contexts.getSessionContext().set("webDavClient", new WebDavMockClient());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多