【问题标题】:Optional Scoped injection in GuiceGuice 中的可选范围注入
【发布时间】:2011-06-07 13:40:21
【问题描述】:

只有在当前范围内可用时才需要注入字段,否则为 null。例如:

public class Thinger implements Provider<SomeSuch> {
    public @Inject(optional=true) HttpServletRequest request;        

    public SomeSuch get() {
        return request == null ? new WhosIt() : WhatsIt();
    }
}

但是,如果 HttpServletRequest 已绑定(确实如此)但不在范围内,我会收到 ProvisioningException。我已经能够找到一种优雅的方式来做到这一点,所以我只能做类似的事情。

HttpServletRequest request = null;
try {
    request = injector.getInstance(HttpServletRequest.class);
} catch(ProvisioningException e) {}

这感觉有点不对劲。有没有合适的方法来做到这一点?

【问题讨论】:

    标签: java scope guice optional inject


    【解决方案1】:

    究竟是什么决定了您的课程可用? HttpServletRequest 在某种程度上对我来说是违反直觉的,因为在非请求范围的服务中没有请求对我来说听起来像是一个错误。

    一个想法(通常)是为持有者编写一个自定义提供程序,只使用一个 get/set 方法。在提供程序中,您可以运行检查,无论您的事物在当前范围内是否可用,它始终返回您需要的类型的 Holder,但根据可用的事物,它可能为空/null。由于您总是返回一个支架,因此注射器应该没问题。您只需要检查要注入它的组件中的 null 即可。

    希望这会有所帮助。

    【讨论】:

    • 我们如何检查我们是否“在”一个范围内?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    相关资源
    最近更新 更多