2011-01-12 87 views
4

只有当它在当前作用域中可用时,我才需要注入一个域,否则为空。例如:Guice中的可选作用域注入

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) {} 

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

回答

3

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

一个想法是(一般来说)是用get/set方法为Holder编写自定义提供程序。在提供程序中,您可以运行检查,无论您的Thing在当前作用域中是否可用,它总是返回您需要的类型的Holder,但根据可用的情况它可能为空/ null。既然你总是返回一个持有人注射器应该没问题。你只需要在你注入的组件中检查null。

希望这会有所帮助。

+0

我们如何检查我们是否在一个范围内? – BrunoJCM 2014-05-01 16:33:11