我对gwt-dispatch和guice有一些疑问。我正在使用Guice 2.0,gwt-dispatch 1.1.0快照,mvp4g 1.1.0和GIN 1.0
首先,我已经定义了简单的动作,结果和处理程序:
ListContactsAction.java
public class ListContactsAction implements Action<ListContactsResult>{
public ListContactsAction() {
}
}
ListContactsResult.java
public class ListContactsResult implements Result {
private List<Contact> contactList;
public ListContactsResult() {
}
public ListContactsResult(List<Contact> contactList) {
this.contactList = contactList;
}
public List<Contact> getContactList() {
return contactList;
}
}
ListContactsHandler.java
public class ListContactsHandler implements ActionHandler<ListContactsAction, ListContactsResult>{
@Inject
private SqlSessionFactory factory;
public Class<ListContactsAction> getActionType() {
return ListContactsAction.class;
}
public ListContactsResult execute(ListContactsAction a, ExecutionContext ec) throws DispatchException {
// some code using SqlSessionFactory and returning ListContactResult
// with list of contacts
}
public void rollback(ListContactsAction a, ListContactsResult r, ExecutionContext ec) throws DispatchException {
/* get action - no rollback needed */
}
}
在我的应用程序的先前版本中,使用rpc服务而不是命令模式,我有一个方法,为注射提供SqlSessionFactory
,如下所示:
@Provides
public SqlSessionFactory getSqlSessionFactory(){
// some code here
}
我在gwt-dispatch上开始阅读我必须在我的动作和它的处理程序之间提供绑定,它看起来应该是这样的:
public class ContactModule extends ActionHandlerModule{
@Override
protected void configureHandlers() {
bindHandler(ListContactsAction.class, ListContactsHandler.class);
}
}
但我有问题用Guice连接它,因为这个例子来自gwt-dispatch site:
public class DispatchServletModule extends ServletModule {
@Override
public void configureServlets() {
serve( "/path/to/dispatch" ).with( DispatchServiceServlet.class );
}
}
不起作用,因为包中没有DispatchServiceServlet
。
我的问题是:
DispatcherAsync
SqlSessionFactory
提供方法(在哪个模块中)以便能够在需要的地方注入SqlSessionFactory 我认为这就是全部,我让自己清楚了。如果事情不够清楚,我会尝试更具体。
答案 0 :(得分:1)
您是否创建了GuiceServletConfig类?这是您使用Guice设置Dispatch servlet模块以及动作处理程序模块的地方。
plubic class GuiceServletConfig extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new HandlerModule(), new DispatchServletModule());
}
}
HandlerModule是你的ActionHandler模块类,因此你可以从你的代码中放入你的ContactModule类。
对于您的SqlSessionFactory,您可以在ContactModule中为它设置绑定,我的代码我只有一个ServerModule来设置我的所有服务和操作处理程序绑定。这主要是为了简单起见。
答案 1 :(得分:1)
GWT-Platform框架使用gwt-dispatch fork来处理rpc请求。如果您认真考虑使用调度程序和Guice,那么您可能需要自己编写很多代码。我强烈推荐它。
答案 2 :(得分:1)
首先,我表示同情。将这些全部放在一起并没有记录在任何一个地方。我将依次回答你的每个问题。如果有任何不明确的地方,请在我的答案中添加评论。
QU:我应该如何编写DispatchServletModule以及如何实现它(我应该提供什么路径)?
net.customware.gwt.dispatch.server.guice包中有一个GuiceStandardDispatchServlet类;用那个。我不是百分之百确定原因,但我使用的路径包括我的GWT模块的名称,后跟'/ dispatch'。您可能需要对此进行试验。
public class MyServletModule extends ServletModule {
@Override protected void configureServlets() {
serve("/com.my.module.name/dispatch")
.with(GuiceStandardDispatchServlet.class);
}
}
QU:我应该在我的应用程序的web.xml文件中放置什么才能正确执行我的演示者的操作,该演示者有GIN注入DispatcherAsync实现?
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<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.myapp.whatever.MyContextListener</listener-class>
</listener>
...
</web-app>
...然后你需要一个自定义上下文监听器来创建一个Guice注入器,如下所示。请注意,我已经包含了您的ContactModule,它绑定了动作处理程序。
public class MyContextListener extends GuiceServletContextListener {
@Override protected Injector getInjector() {
return Guice.createInjector(new MyServletModule(),
new ContactModule(), new SQLStuffModule());
}
}
QU:我应该在哪里提供我的SqlSessionFactory提供方法(在哪个模块中)以便能够在需要的地方注入SqlSessionFactory?
请注意,我在前面的代码片段中包含了一个新的SQLStuffModule;这将是一个放置SqlSessionFactory绑定的好地方。有多个模块没有坏处,我发现它可以很好地分离各种问题。
QU:我如何实例化注入器,然后我可以在其他操作处理程序中正确使用它?
对于服务器端,请参阅上面的MyContextListener代码段。
在客户端,您需要一个这样的自定义注入器接口:
@GinModules(StandardDispatchModule.class, MyClientModule.class)
public interface MyGinjector extends Ginjector {
MyWidgetMainPanel getMainPanel();
}
...您可以将自己的MVP内容绑定到自定义Gin模块中,如下所示。对不起,我不熟悉mvp4g,但我认为你需要在模块类中将视图和演示者连接在一起。
public class MyClientModule extends AbstractGinModule {
@Override protected void configure() {
bind(...).to(...);
...
}
}