这次的项目中,一个同事遇到了一个奇怪的问题。背景是这样的,项目中使用了struts2+spring,在前端有一个功能实现是使用JQuery的ajax请求访问一个struts2的action,要求返回的是view是json。其中项目加入了如下本问题相关的jar包:struts2-core-2.1.8.1.jar,struts2-json-plugin-2.2.1.jar,json-lib-2.4-jdk15.jar。具体的代码与配置都没有问题,即使用了标准的相关写法,因为不涉及到这个问题的讨论,所以就不贴代码了。因为当时帮他调试的时候没有记录具体的异常,我在网上找到了相关的问题贴,转载如下:
http://hi.baidu.com/%BF%AA%CB%B3/blog/item/c06cbf451d530b8cb3b7dc4c.html
异常形式:
Class org.apache.struts2.json.JSONWriter can not access a member of * 或是 Class com.googlecode.jsonplugin.JSONWriter can not access a member of class* 第一种是struct2.1.8与json结合时的异常,第二种是struct2.1.6与json结合的异常。
具体:
Class org.apache.struts2.json.JSONWriter can not access a member of class oracle.jdbc.driver.BaseResultSet with modifiers "public"
解释:
不能把程序中的某种数据结构串行化成json格式。
原因:
struts2的action里面的数据转换成json数据时,会将提供了get方法的属性都串行化输出JSON到客户端。有的时候,很多属性并不能串行化成json数据,比如这里的oracle.jdbc.driver.BaseResultSet。这时还进行强行转换就会出现这样的异常。
解决方法:
在不能串行化到json的属性相应的get方法前加一条json标记@JSON(serialize=false)。告诉json不需要转化这个属性。或者根本不写这个get方法。
后记:
对于不需要在前台输出的json数据,也可以用同样的方法进行处理,从而减少服务器和客户端间交互的信息量。
可在需要在前台输出的属性的get方法前加上@JSON(name="status")标识,从而为该属性起了一个别名,在前台就可以通过status作为属性名来读取其值。
由此可见是因为序列化问题造成的,反思我们项目中的问题,原因是因为在action中注入service时使用的是接口(网上的另一种说法是在action中的接口不能给予get方法,但是那只是描述了现象,如果上文所述正确的话那从本质上说明了原因),而且提供了get方法,接口不能被串行化。去掉get方法后,异常消失。先在此记录下,有空了看下相关的源代码,拿源码说事更有说服力....
分享到:
相关推荐
当Action执行完毕后,可以返回一个JSON结果类型,Struts2会自动将Action的属性转换为JSON格式并返回给前端。 接着,我们讨论AJAX。AJAX是一种在不重新加载整个网页的情况下,能够更新部分网页的技术。在本资源中,...
总结来说,“Struts2+Json+Android简单实现”是一个典型的前后端交互示例,展示了如何利用Struts2作为服务端接口,通过JSON进行数据交换,最后在Android客户端进行数据展示和用户交互。理解并掌握这种技术栈对于构建...
4. 将JSON数组设置为Action的返回值,Struts2的JSON插件会自动处理这个返回值,将其包装成JSON响应并发送到前端。 在前端,EXTJS使用Ajax请求调用Struts2 Action,接收返回的JSON数据,然后动态渲染UI,展示所有...
在Struts2中,我们可以使用Struts2的JSON插件将Action的返回值转换为JSON格式,方便前端JavaScript进行处理。 最后,JQuery是一个强大的JavaScript库,它简化了DOM操作、事件处理、动画制作以及Ajax交互。在本例中...
3. **配置问题**:检查Struts2的配置文件(如struts.xml)中的配置是否正确,特别是关于JSON插件的部分。 #### 三、总结 通过以上步骤,我们可以利用Struts2框架结合jQuery与JSON轻松地实现Ajax功能。需要注意的是...
接着,我们需要配置Struts2的JSON插件,以支持JSON输出。这通常涉及在struts.xml配置文件中添加特定的拦截器栈,确保JSON结果类型能够被正确处理。 在前端,我们可以使用jQuery来发起Ajax请求,通过$.ajax()或$.get...
ExtJS + Struts2 + Hibernate + JSON 登录程序是一个典型的Web开发示例,结合了前端JavaScript框架、MVC框架、持久层框架以及数据传输格式,实现了用户登录功能的前后端交互。下面将详细阐述这些技术及其在登录程序...
首先,Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,它简化了开发过程,提供了强大的控制层功能。在Struts2中,Action类是业务逻辑的主要载体,而Struts2的标签库则提供了丰富的视图渲染...
Struts2是一个流行的Java web框架,它为开发者提供了一种结构化的方式来构建MVC(Model-View-Controller)应用程序。而JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端数据交互。在...
在Struts2中,实现JSON支持需要配置Struts2的JSON插件。首先,需要在项目的`struts.xml`配置文件中添加相应的配置,启用JSON结果类型。例如: ```xml <constant name="struts.enable.SlashesInActionNames" value=...
"Struts2+JSON+jQuery实现Ajax数据的存取"就是一个典型的示例,它结合了强大的MVC框架Struts2、轻量级的数据交换格式JSON以及高效的前端库jQuery,以实现网页上的无刷新数据交互。下面将详细介绍这三个技术及其在...
Struts2 是一个基于MVC(Model-View-Controller)架构的Java Web框架,它使得开发者可以更有效地管理前端与后端的交互,提供了强大的拦截器机制和丰富的插件支持,简化了HTTP请求的处理过程。在Struts2中,开发者...
总结起来,"struts2+jquery+json+ajax"的例子展示了如何利用这些技术协同工作,实现一个无刷新的登录界面,提供流畅的用户体验。通过Struts2处理业务逻辑和数据验证,jQuery和Ajax负责前后端的通信,JSON作为数据...
Struts2可以集成JSON插件,使Action可以直接返回JSON格式的结果,供前端JavaScript进行解析和处理。 在"SSSSH2"这个项目中,可能包含了使用Struts2、Hibernate和Spring整合开发的示例代码。通过这些代码,我们可以...
Struts2 JSON插件是官方提供的一个扩展,它使Struts2可以轻松地生成和处理JSON响应。在集成此插件之前,你需要在项目中引入`jsonplugin-0.1.34.jar`这个依赖包。该插件提供了几个关键组件和配置: 1. **struts-...
JSON插件是Struts2的一个扩展插件,它提供了JSON结果类型(Result Type),使得开发者可以在Action中直接返回JSON格式的数据,而无需显式地编写视图层代码来渲染这些数据。这对于实现基于Ajax的交互非常有用。 ####...
综上所述,这个项目展示了如何整合前端的ZTree、Struts2框架,以及Ajax和JSON技术,实现一个动态的、基于checkbox的权限树,优化了权限管理的用户体验,同时通过存储过程减少了对数据库的频繁访问,提升了系统性能。
1. **服务器端处理**:在Struts2 Action中,根据业务逻辑处理请求并创建一个Java对象,然后使用Struts2的JSON插件将对象转换为JSON字符串。 2. **HTTP响应**:服务器将JSON字符串作为HTTP响应的主体内容返回给...