`
witcheryne
  • 浏览: 1099105 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Gxt2.1中使用Gwt2.0开发模式.初探.java.lang.VerifyError问题解决

阅读更多

    前两天看见Gwt2.0发布的消息,新的特性让人相当兴奋,尤其是开发者模式,大大提高了调试效率。随即就将项目升级到了Gwt2.0+Gxt2.1, 并且eclipse也更新到最新的1.2..  

    安装插件,运行代码,一路基本都没有问题。。  在开发者模式下访问host page...  碰到如下错误:

 

    错误信息 写道

17:03:39.250 [ERROR] [webim] Unable to load module entry point class st.lv.web.im.client.WebIM (see associated exception for details)
java.lang.VerifyError: (class: com/extjs/gxt/ui/client/widget/Container, method: adjustIndex signature: (Lcom/extjs/gxt/ui/client/widget/Component;I)I) Illegal constant pool index
at com.extjs.gxt.ui.client.widget.MessageBox.getDialog(MessageBox.java:339)
at com.extjs.gxt.ui.client.widget.MessageBox.show(MessageBox.java:737)
at com.extjs.gxt.ui.client.widget.MessageBox.alert(MessageBox.java:104)
at st.lv.web.im.client.WebIM.onModuleLoad(WebIM.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:369)
at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:185)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:380)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:222)
at java.lang.Thread.run(Unknown Source

     经过一番google也没查出什么原因, 用一段很简单的代码调试追踪(代码如下:),发现是devMode反射的时候出的问题,虽然知道问题的大致原因,但是还是没办法解决。

     package st.lv.web.im.client;


import com.google.gwt.core.client.EntryPoint;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class WebIM implements EntryPoint {

	
	/**
	 * This is the entry point method.
	 */
	public void onModuleLoad() {
		
//		com.google.gwt.user.client.Window.alert("ok..");//this line is ok..
		com.extjs.gxt.ui.client.widget.MessageBox.alert("gxt", "gxt", null);
	}
}

 

    最后只得求助ext的官方论坛, 最终将这段代码跑通解决了。。

http://www.extjs.com/forum/showthread.php?p=420100#post420100post420100

 

    经tortexy解释: 该原因是由Class Loader产生的,当com.extjs.gxt.ui.client.widget.Layout加载太晚,classloader将停止执行。

 

   最终代码如下所示:

package st.lv.demo.overview.client;

import com.extjs.gxt.ui.client.widget.Layout;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.layout.AnchorLayout;
import com.google.gwt.core.client.EntryPoint;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class Gwt2Gxt implements EntryPoint {

	/**
	 * This is the entry point method.
	 */
	public void onModuleLoad() {		
		
		@SuppressWarnings("unused")
		Layout junk = new AnchorLayout();//提前初始化Layout对象
		MessageBox.alert("Msg", "gxt MessageBox", null);	
	}
}

 

    虽然这个问题解决了,但是项目在Gxt2.1+Gwt2.0的Develop Mode下还是会报很多错误,依然没有升级到Gwt2.0...  不过在Gxt的论坛上并没有太多设计关于Gxt2.1中使用Gwt2.0新特性的问题,看来这些东西又得自己开始慢慢摸索了。。。

分享到:
评论
10 楼 angjunwen 2010-01-13  
GWT 和spring security 整合的问题终于在昨天解决了,最终还是参考 code google 上 dmartin.pro 的 gwt-incubator-security 来完成的,不过 gwt-incubator-security 有个小问题 ,里面用到的 transmorph.jar 好像不能使用最新版本的。
9 楼 angjunwen 2010-01-12  
如果不整合spring security 我目前还没遇到什么问题。谢谢你的回答!
8 楼 witcheryne 2010-01-12  
angjunwen 写道
gwt-incubator-lib 这个我也看过,但是我没有找到使用它开发的实例,其实spring security 官方提供的例子中有整合GWT的,但是那只是在JSP文件中引入GWT 的相关组件,不是一个纯粹的 GWT 应用。有关GWT 和 spring security 整合的例子我也看过几个,但都不是单纯的GWT 应用,我现在准备做的是一个单纯用GWT+GXT 做前台表现的应用。gwt-incubator-lib 只是在 GWT-SL的基础上进行了一些封装(个人认为)。我不知道你那个应用是不是用单纯的gwt做表现层的 ?


我们项目也是在用Gwt + Gxt,通过RPC调用和后台交互... 

spring security好像没用到,整合这方面可能没办法帮你...

关于是否在jsp文件中引入GWT组件, 这个应该没有什么影响吧···
gwt中的html页面也只是引用编译后的js文件而已,只要页面能引用js就行。。。
7 楼 angjunwen 2010-01-12  
http://www.javaworld.com.tw/jute/post/view?bid=49&id=251825 这里有个 GWT+Spring+Spring Security+Hibernate  的例子,但是他也是在JSP 中引入 GWT .使用了 GWT-SL.JAR .
6 楼 angjunwen 2010-01-12  
gwt-incubator-lib 这个我也看过,但是我没有找到使用它开发的实例,其实spring security 官方提供的例子中有整合GWT的,但是那只是在JSP文件中引入GWT 的相关组件,不是一个纯粹的 GWT 应用。有关GWT 和 spring security 整合的例子我也看过几个,但都不是单纯的GWT 应用,我现在准备做的是一个单纯用GWT+GXT 做前台表现的应用。gwt-incubator-lib 只是在 GWT-SL的基础上进行了一些封装(个人认为)。我不知道你那个应用是不是用单纯的gwt做表现层的 ?
5 楼 witcheryne 2010-01-12  
angjunwen 写道
能否把你项目关于gwt和spring security 整合如何整合的讲解下?

代买我贴出来,不知道是不是你需要的...
import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.context.WebApplicationContext;

import cn.com.dayang.common.user.domain.RemoteUser;
import cn.com.dayang.common.user.domain.User;
import cn.com.dayang.common.user.webwork.interceptor.LoginInterceptor;

import com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.server.rpc.RPC;
import com.google.gwt.user.server.rpc.RPCRequest;
import com.google.gwt.user.server.rpc.RPCServletUtils;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.google.gwt.user.server.rpc.SerializationPolicy;

/**
 * @author Zwf
 * 
 */
public class MyGWTServer extends RemoteServiceServlet {
	

	private final ThreadLocal<HttpServletRequest> perThreadRequest = new ThreadLocal<HttpServletRequest>();
	private final ThreadLocal<HttpServletResponse> perThreadResponse = new ThreadLocal<HttpServletResponse>();

	private WebApplicationContext springContext;

	@Override
	public void init(ServletConfig Config) throws ServletException {
		super.init(Config);
		springContext = (WebApplicationContext) Config.getServletContext().getAttribute(
				WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

		if (springContext == null) {
			throw new RuntimeException("Check Your Web.Xml Setting, No Spring Context Configured");
		}

	}

	@Override
	protected SerializationPolicy doGetSerializationPolicy(HttpServletRequest request, String moduleBaseURL,
			String strongName) {
		return super.doGetSerializationPolicy((HttpServletRequest) perThreadRequest.get(), moduleBaseURL, strongName);
	}

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		try {
			
			perThreadRequest.set(req);
			perThreadResponse.set(resp);
	
			String requestURI = req.getRequestURI();
			String beanname = requestURI.substring(requestURI.lastIndexOf("/") + 1,requestURI.lastIndexOf(".gwt"));
			RemoteService service = (RemoteService) springContext.getBean(beanname);

			String requestPayload = readPayloadAsUtf8(req);
			
			// Let subclasses see the serialized request.
			//    
			onBeforeRequestDeserialized(requestPayload);

			// Invoke the core dispatching logic, which returns the serialized
			// result.
			//    
			 HttpSession session=req.getSession(true);
			 if(session.getAttribute(LoginInterceptor.USER_LOGIN)==null)
			{
			System.out.println("no user login!!!!!");
				throw new Exception("please login");
			}
			 User user = (User)session.getAttribute(LoginInterceptor.USER_LOGIN);
			 RemoteUser.set(user);
			String responsePayload = processCall(service, requestPayload);

			// Let subclasses see the serialized response.
			//    
			onAfterResponseSerialized(responsePayload);

			// Write the response.
			//    
			writeResponse(req, resp, responsePayload);
		} catch (Throwable e) {
			// Give a subclass a chance to either handle the exception or
			// rethrow it
			//    
			doUnexpectedFailure(e);
		} finally {
			// HttpRequestContext.ThreadLocalHttpRequestContext.remove();
			perThreadRequest.set(null);
			perThreadResponse.set(null);
		}
	}

	/**
	 * rewrite processCall
	 * 
	 * @param bean
	 * @param payload
	 * @return
	 * @throws SerializationException
	 */
	public String processCall(RemoteService bean, String payload) throws SerializationException {
		try {			
			RPCRequest rpcRequest = RPC.decodeRequest(payload, bean.getClass(), this);
			return RPC.invokeAndEncodeResponse(bean, rpcRequest.getMethod(), rpcRequest.getParameters(), rpcRequest
					.getSerializationPolicy());
		} catch (IncompatibleRemoteServiceException ex) {
			getServletContext().log("An IncompatibleRemoteServiceException was thrown while processing this call.", ex);
			return RPC.encodeResponseForFailure(null, ex);
		}
	}

	private String readPayloadAsUtf8(HttpServletRequest request) throws IOException, ServletException {
		return RPCServletUtils.readContentAsUtf8(request, true);
	}

	private void writeResponse(HttpServletRequest request, HttpServletResponse response, String responsePayload)
			throws IOException {
		boolean gzipEncode = RPCServletUtils.acceptsGzipEncoding(request)
				&& shouldCompressResponse(request, response, responsePayload);
		RPCServletUtils.writeResponse(getServletContext(), response, responsePayload, gzipEncode);
	}
}


这个是关于Gwt Security的一个扩展...
http://code.google.com/p/gwt-incubator-lib/
相关主题可以看这里:
http://osdir.com/ml/GoogleWebToolkit/2009-02/msg01214.html
4 楼 angjunwen 2010-01-11  
能否把你项目关于gwt和spring security 整合如何整合的讲解下?
3 楼 witcheryne 2010-01-02  
angjunwen 写道
gxt2.1 和 gwt 整合真的有这么多问题吗?我近期正在准备用gwt2.0+gxt2.1+spring+spring security+hibernate+mysql 来开发一个管理平台,如果gxt2.1和gwt2.0 整合有这些问题我就要降低版本了。还有不知你们用GWT整合过springsecurity没有,在网上GOOGLE了几天只有在国外的网站上发现有人这么整过。

项目有整合spring, 这部分不是我做的... 节后上班可以给你看看。。

关于Gxt2.1和Gwt2.0兼容问题,我在官网上并没找到什么讨论文章,如果直接使用应该没什么问题。。
我们项目是从Gwt1.5+Gxt1.2.3一路走过来的,中间经历过从Gwt1.5+Gxt1.2.3到Gwt1.6+Gwt2.0,一次大的升级。可能是由于一些历史代码的原因,最近升级到Gwt2.0+Gxt2.1一直没有成功。现在项目保持Gwt1.7+Gxt2.1

不过官方解释很明确,Gxt2.1是基于Gwt2.0编译..  直接应该没什么问题..


2 楼 angjunwen 2009-12-31  
gxt2.1 和 gwt 整合真的有这么多问题吗?我近期正在准备用gwt2.0+gxt2.1+spring+spring security+hibernate+mysql 来开发一个管理平台,如果gxt2.1和gwt2.0 整合有这些问题我就要降低版本了。还有不知你们用GWT整合过springsecurity没有,在网上GOOGLE了几天只有在国外的网站上发现有人这么整过。
1 楼 toeo 2009-12-19  
对.分页的那个地方也有错误.所以要用GXT 还是用 GWT 1.7 比较好.

相关推荐

    GXT2.0 EXT=GWT !!!!

    GWT本身是一个Java到JavaScript的编译器,它允许开发者使用Java语言进行开发,然后编译成优化过的JavaScript代码,以在浏览器环境中运行。 描述中的“看看吧看看吧看看吧看看吧看看吧看看吧看看吧看看吧”虽然没有...

    gxt-2.2.4 EXT GWT

    gxt-2.2.4 EXT GWT Note : Ext GWT 2.X requires GWT 1.7+ or GWT 2.0+ (any build ending in "-gwt2.zip").

    gxt2.1-api.CHM

    gxt是ext使用gwt api开发的一套东东。比使用原始gwt开发是要轻松一些的。

    浪曦原创]GXT系列+第1讲+GXT_GWT的安装.

    浪曦原创]GXT系列+第1讲+GXT_GWT的安装.

    gxt-2.2.3-gwt22.jar

    gxt-2.2.3-gwt22.jar包,备份以自用。

    gxt-2.2.5-gwt22.jar

    gxt用jar包,2.25版本,我自己用过的,没问题,放在这里备份下~

    gxt-2.1.1-gwt2 最新的

    gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2

    gxt.jar(gwt开发使用)

    gwt 开发

    Ext GWT 2.0 Beginner’s Guide

    通过跟随项目步骤,读者将能够亲自动手构建完整的Web应用程序,并解决在实际开发过程中可能遇到的问题。 ### 目标读者 《Ext GWT 2.0 初学者指南》适合所有级别的Java开发者,特别是那些希望将GWT和Ext GWT集成到...

    gwt + gxt jar包

    在【压缩包子文件的文件名称列表】中,"gwt+gxt"可能表示的是包含GWT和GXT库的JAR文件,例如GWT的gwt-user.jar、gwt-dev.jar以及GXT的gxt.jar、gxt-theme-neptune.jar等。这些JAR文件通常需要添加到项目的类路径中,...

    搭建gxt-2.2.0环境,让我们第一个简单程序跑起来

    1. **开发模式**:在IDE中运行GWT的开发模式,这将启动一个内置的开发服务器,你可以实时看到代码更改的效果。 2. **超级DevMode**:对于更高效的调试,可以使用GWT的Super Dev Mode,它提供更快的代码编译和更新...

    搭建简单的EXT-GWT(GXT)的开发环境(四)ext-gwt(gxt)结合google map第三版开发

    6. **调试与部署**:使用GWT的开发模式进行调试,当一切准备就绪后,可以编译成优化的JavaScript代码进行部署。 总结,搭建EXT-GWT开发环境并结合Google Maps API V3,需要熟悉Java、GWT和EXT-GWT的基础知识,同时...

    Developing with Ext GWT Enterprise RIA Development.pdf完全版

    本书旨在帮助Java开发者快速掌握如何使用Ext GWT框架开发企业级RIA(Rich Internet Application,富互联网应用)。 #### 二、主要内容 本书共约140页,主要涵盖了以下几个方面: 1. **入门指南**:首先介绍了如何...

    gxt、gwt与spring结合使用

    在IT行业中,GXT(Ext GWT)和GWT(Google Web Toolkit)是两种流行的JavaScript库,用于构建富互联网应用程序(Rich Internet Applications, RIA)。它们都是基于Java语言的,可以提供丰富的用户界面组件和高效的...

    搭建简单的EXT-GWT(GXT)的开发环境

    Google Plugin for Eclipse包含了GWT的开发工具,使得在Eclipse中编写、测试和调试GWT应用变得更加便捷。你可以从提供的链接下载这两个工具:http://code.google.com/intl/zh-CN/webtoolkit/download.html。 安装...

    GWT通信机制初探

    开发模式允许开发者在本地环境中运行和调试GWT应用,而GWT Compiler则负责将Java代码转换成高效的JavaScript。 文件名称“SpringWithGxt”可能是指GXT(EXT GWT)库,它是Sencha提供的一个强大的GWT组件库,用于...

    EXT-GWT(GXT) 2.2.4 JAVA API DOC chm 版

    EXT-GWT,全称为Ext GWT,是Sencha公司推出的一款基于Java的开源富互联网应用程序(Rich Internet Application,RIA)开发框架。GXT是EXT-GWT的简称,它提供了丰富的用户界面组件,允许开发者用Java代码来构建复杂的...

Global site tag (gtag.js) - Google Analytics