繁体   English   中英

Guice中可选的Scoped注射

[英]Optional Scoped injection in Guice

我只需要在当前作用域中可用时注入一个字段,否则返回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) {}

这只是感觉各种各样的错误。 有没有正确的方法来做到这一点?

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

一个想法(通常)是仅使用get / set方法为持有者编写自定义Provider。 在提供程序中,您可以运行检查,无论您的Thing是否在当前作用域中可用,它始终返回您需要的类型的Holder,但它可能为空/ null,具体取决于可用的东西。 由于您总是返回一个持有人,注射器应该没问题。 您只需要在注入此组件的组件中检查null。

希望这可以帮助。

暂无
暂无

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

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