我有一个使用 Guice [v3] 的工作 Wicket [v6] 应用程序 - 我现在已经将依赖注入用于存储库操作,我想将其扩展到使用会话范围内的服务(每个用户会话一个)。我在这里阅读了官方文档、各种博客文章和问题,但我不确定我是否使用了正确的方法。
我有两个问题:1.我使用正确的方式吗?2. 在依赖 SessionScoped 注入的类上运行 TestNG 测试需要什么特别的东西吗?
我的设置:web.xml:
<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>com.xxx.CustomServletConfig</listener-class>
我的应用程序初始化:
@Override
protected void init()
{
super.init();
getResourceSettings().setResourcePollFrequency(null);
getMarkupSettings().setStripWicketTags(true);
getDebugSettings().setDevelopmentUtilitiesEnabled(true);
GuiceComponentInjector injector = new GuiceComponentInjector(this, new WebModule(), new GuiceModule());;
}
自定义Servlet配置:
public class CustomServletConfig extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new GuiceModule(), new WebModule());
}
网络模块:
public static class WebModule extends ServletModule {
@Override
protected void configureServlets() {
bind(WebApplication.class).toProvider(WicketGuiceAppProvider.class).asEagerSingleton();
bind(IUserService.class).to(UserService.class).in(ServletScopes.SESSION);
Map<String, String> params = new HashMap<String, String>();
params.put(WicketFilter.FILTER_MAPPING_PARAM, "/*");
filter("/*").through(WicketGuiceFilter.class, params);
}
}
在一个示例页面中,我有:
@Inject
IUserService userService
...
userService.doSomething
在单元测试期间的 userService.doSomething 中,我收到 Guice OutOfScopeException,指向我在 ServletModule 中的绑定: 自定义提供程序出错,com.google.inject.OutOfScopeException?:无法访问范围对象。要么我们当前不在 HTTP Servlet 请求中,要么您可能忘记应用 com.google.inject.servlet.GuiceFilter?作为此请求的 servlet 过滤器。
我的配置是否正常,我需要以不同的方式运行单元测试(我只是用 WicketTester 启动我的应用程序),还是我的设计有问题?