无法将 GWT 与 Spring RestTemplate 实现集成

Posted

技术标签:

【中文标题】无法将 GWT 与 Spring RestTemplate 实现集成【英文标题】:could not integrate GWT with Spring RestTemplate implementation 【发布时间】:2012-10-19 10:32:03 【问题描述】:

我是 GWT 的初学者。目前我正在尝试在 Spring 中创建一个 Web 应用程序来使用来自 REST 的数据并在 GWT 中显示这些详细信息。因此,我使用 Spring RestTemplate 作为客户端(发出请求并解组到 java 对象)并将依赖注入留给 Spring(注释)。我在具有 GWT-2.4 插件的 Eclipse IDE 中开发了这些东西。

我已尝试在以下案例中启动此 Web 应用程序并遇到指定问题。

案例#1: 当我尝试将应用程序作为 Google Web 应用程序启动(右键单击 -> 运行方式 -> Google Web 应用程序)时,没有发生依赖注入,它会在属性引用上引发 NullPointerException。我想当我开始使用 Google App 时,它不会加载我的上下文,因此 Bean-DI 不会发生。

案例#2: 在尝试在 Tomcat 服务器上运行时,我所有的 Bean 创建和依赖注入都在发生,但它并没有为 GWT 创建一个入口点。我没有明确定义任何控制器,因为我认为 GWT 会处理它(就像在 Google Web App Server 中运行一样)。

注意:当我单独运行 GWT 模块(不使用来自 WebService 的数据)时,应用程序运行良好,甚至 Spring RestTemplate 模块在使用 RestService 并显示值时也运行良好在 System.Out.println() 中。

核心问题是在 GWT 和 Spring DI 之间进行交互。

Project.gwt.xml:

<inherits name='com.google.gwt.user.User'/>
<inherits name='com.google.gwt.user.theme.clean.Clean'/>

<entry-point class='com.abc.XXXX.gwt.ui.client.XXXX'/>

  <source path='client'/>
  <source path='shared'/>
  <source path='service'/>

ApplicationContext.xml:

<context:component-scan base-package="com.serco.XXXX" />

<context:property-placeholder location="classpath:ClientConfig.properties" />

<bean id="clientSkillService" class="com.abc.XXXX.gwt.ui.service.clientService.impl.ClientSkillService"
    p:hostName="$rest.hostName"
    p:portNumber="$rest.port"
    p:userName="$rest.userName"
    p:password="$rest.password">
</bean>

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
                <constructor-arg>
                    <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
                        <property name="classesToBeBound">
                            <list>
                                <value>com.abc.XXXX.gwt.ui.shared.SkillDetailList</value>
                                <value>com.abc.XXXX.gwt.ui.shared.SkillDetail</value>
                            </list>
                        </property>
                    </bean>
                </constructor-arg>
            </bean>
        </list>
    </property>
</bean>

Web.xml:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    classpath:ApplicationContext.xml
    </param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

请提供您的建议,如何使其发挥作用。

提前致谢。

更新: html 文件

 <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>XYZ UI DASHBOARD</title>
    <script type="text/javascript" language="javascript" src="RTSocketDataMonitor/RTSocketDataMonitor.nocache.js"></script>
  </head>
  <body>
    <h1 align="center">XYZ UI DASHBOARD</h1>
    <div align="center" id="grid_tbl"></div>
</body>

入口点类:XXXX.java

public class XXXX implements EntryPoint 
    /*entry point method*/
    public void onModuleLoad() 
        //Creation of DialogBoxes and Panel here
        DialogBox dialogBox;
        //Creation of Composite Derived Class which has DataGrid, DataList, Columnprovider properties to render Details in Table format
        SkillDetailPaginationHandler<SkillDetail> skd = 
        new SkillDetailPaginationHandler<SkillDetail>();
        //added VertiCal Panel in Dialogue Boxes and set it in RootPanel
        RootPanel.get("grid_tbl").add(dialogBox);
    

GWT 编译的 WAR 内容:

  ->Root
      -->XXXX(Folder in the Project Name)
        -->gwt(Folder)
        -->XXXX.nocache.js
        -->host.html
      -->WEB-INF (Folder)
        --> deploy
        --> lib 
        --> web.xml

【问题讨论】:

【参考方案1】:

您需要将两个模块分开在单独的项目中。

您需要先编译 GWT 模块,然后将其生成的文件放在主 Web 项目中,然后从 Web 应用程序的控制器调用 GWT 项目的 .html 文件。我希望你理解这一点,它可以帮助你。

【讨论】:

感谢您的回复。您能否详细说明一下,我们需要将 GWT 编译项目(我假设它是 WAR 内容)放在“主 Web 项目”中的哪个位置?如果您提供了一些示例,请不胜感激。 现在我没有它的例子。您可以在 WEB-INF 目录下或与其并行创建一个新文件夹。您只需使用拥有主 html 文件或 GWT 的路径并从控制器调用它。 我已经编译了 GWT 模块并放置在 WEB-INF 文件夹旁边。当我启动 tomcat 服务器时,它呈现 HTML 文件(静态内容),但不是作为 GWT 应用程序。 (实际上我有 DataGrid,它将以OnModuleLoad() 方法发送到这个 HTML)我在这里遗漏了什么吗? (在这篇文章中更新了 HTML 文件) GWT编译文件夹的内容是什么? JS和其他内容在同一个文件夹? 请在POST中找到内容详情。

以上是关于无法将 GWT 与 Spring RestTemplate 实现集成的主要内容,如果未能解决你的问题,请参考以下文章

将 spring 3 mvc 与 GWT 集成的经验?

GWT:响应无法反序列化

GWT Spring 安全集成(纯 GWT,无 JSP)

GWT 2.4 与 Spring 的集成

GWT + Spring + Hibernate中的示例应用程序[关闭]

如何集成 Spring Security 和 GWT?