我的应用程序架构如下所示。 UI层中的GWT - >调用GWT RPC服务(servlet) - >查找Spring Beans - >调用在JPA(EclipseLink)中实现的DAO层。
我已成功使用GWT rpc服务测试应用程序,直接调用JPA层。但我无法将弹簧融入混音中。 (Spring的主要用途是事务管理)。
我试过谷歌搜索,但找不到任何关于这个主题的好文章。 (大多数文章都指的是在GWT中使用Spring MVC,这不是我想要的) 你能指点我一些文章/教程吗?
提前致谢!
的Manoj
答案 0 :(得分:0)
如果您正在寻找非常简单的东西,为什么不从服务实现中调用应用程序上下文中的bean?类似的东西:
public class GreetingServiceImpl extends RemoteServiceServlet implements
GreetingService {
public String greetServer(String input) throws IllegalArgumentException {
return WebApplicationContextUtils.getRequiredWebApplication(getServletContext()).
getBean(GreetingService .class).greetServer(input);
}
}
支持应用程序上下文必须提供GreetingService
的“真实”实现。
Seee this article。
答案 1 :(得分:0)
我发现的一个有趣的问题是我经常希望我的servlet是一个Spring管理的bean。这样,它可以执行所有依赖注入等。但通常,您必须在web.xml中指定您的servlet,这意味着您的容器(例如Tomcat)而不是Spring将创建servlet。
使用HttpRequestHandlerServlet可以解决这个问题。我的web.xml文件包含以下行:
<servlet>
<servlet-name>dataProvider</servlet-name>
<servlet-class>
org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>documentCreator</servlet-name>
<servlet-class>
org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dataProvider</servlet-name>
<url-pattern>/dataProvider/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>documentCreator</servlet-name>
<url-pattern>/documentCreator/*</url-pattern>
</servlet-mapping>
这告诉Spring它将使用它的两个bean作为servlet,一个叫做dataProvider,另一个叫做documentCreator。它必须使用xml配置文件或注释来计算这些bean的内容。我更喜欢注释,例如@Controller。
那么当Tomcat收到请求时会发生什么,例如GET / dataProvider / test 从servlet-mapping部分,它知道它必须将该请求提供给它创建的第一个HttpRequestHandlerServlet。该类知道它具有名称dataProvider,并且它在Spring上下文中查找名为dataProvider的bean。然后它调用该bean上的handleRequest方法。
我的DataProvider类如下所示:
@Controller
public class DataProvider extends HttpServlet implements HttpRequestHandler {
@Autowired
private OtherBeanType otherBean
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
// my doGet method
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
// my doPost method
}
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (request.getMethod().equalsIgnoreCase("GET")) {
doGet(request, response);
} else if (request.getMethod().equalsIgnoreCase("POST")) {
doPost(request, response);
}
}
}
我认为我们需要handleRequest()方法有点不幸(如果你使用Get和Post之外的任何东西,你需要在那里添加它们)。如果HttpRequestHandlerServlet可以为你做这项工作会更好,但这就是它现在的工作原理。