今天项目遇到了一个问题, 本地没有问题, 但是一放到服务器上,ajax 请求就一直报错:
Caused by: java.lang.IllegalAccessException: Class org.apache.struts2.json.JSONWriter can not access a member of class org.hibernate.cfg.annotations.PropertyBinder$NoValueGeneration with modifiers "public"
网上查了一下, 说是返回的 json 数据中有问题, 解决方法
一. 在 struts.xml 中配置 root 属性,
<package name="super_admin" extends="json-default" namespace="/superadmin">
<action name="allAuthorities" class="edu.bjfu.action.AuthoritiesAction">
<result type="json"><param name="root">authorities</param></result>
</action>
</package>
二. 对于不需要 json 序列化的属性加上 @JSON(serialize=false), 表示不序列化, 这个有可能是 action 中的属性, 也有可能是返回到页面上的数据中(即实体)的属性,
但是我不确定是哪个实体中的属性不能序列化, 只能采用一个笨方法, 找到JSONWriter 的源码, 在这些地方加上输出信息
protected void bean(Object object) throws JSONException {
this.add("{");
BeanInfo info;
System.out.println("start=====================>"+object.getClass());
try {
Class clazz = object.getClass();
info = ((object == this.root) && this.ignoreHierarchy)
? getBeanInfoIgnoreHierarchy(clazz)
: getBeanInfo(clazz);
System.out.println("-------------获取 props 前--------");
PropertyDescriptor[] props = info.getPropertyDescriptors();
System.out.println("-------------获取 props 后--------");
boolean hasData = false;
for (PropertyDescriptor prop : props) {
String name = prop.getName();
System.out.println("name=============>"+name);
Method accessor = prop.getReadMethod();
Method baseAccessor = findBaseAccessor(clazz, accessor);
if (baseAccessor != null) {
if (baseAccessor.isAnnotationPresent(JSON.class)) {
JSONAnnotationFinder jsonFinder = new JSONAnnotationFinder(baseAccessor).invoke();
if (!jsonFinder.shouldSerialize()) continue;
if (jsonFinder.getName() != null) {
name = jsonFinder.getName();
}
}
// ignore "class" and others
if (this.shouldExcludeProperty(prop)) {
continue;
}
String expr = null;
if (this.buildExpr) {
expr = this.expandExpr(name);
if (this.shouldExcludeProperty(expr)) {
continue;
}
expr = this.setExprStack(expr);
}
Object value = accessor.invoke(object);
if (baseAccessor.isAnnotationPresent(JSONFieldBridge.class)) {
value = getBridgedValue(baseAccessor, value);
}
boolean propertyPrinted = this.add(name, value, accessor, hasData);
hasData = hasData || propertyPrinted;
if (this.buildExpr) {
this.setExprStack(expr);
}
}
}
// special-case handling for an Enumeration - include the name() as
// a property */
if (object instanceof Enum) {
Object value = ((Enum) object).name();
this.add("_name", value, object.getClass().getMethod("name"), hasData);
}
} catch (Exception e) {
System.out.println("catch exception=====================>"+object.getClass());
throw new JSONException(e);
}
this.add("}");
}
根据抛出异常的最后一个实体从下往上查找, 一步一步尝试
我碰到的问题用第一种方法没有解决, 用的是第二种方式. 即我返回的实体中有一个关联对象 User, 我在他的 get 方法上加上@JSON(serialize=false) 就可以了
分享到:
相关推荐
赠送jar包:struts2-json-plugin-2.3.24.jar; 赠送原API文档:struts2-json-plugin-2.3.24-javadoc.jar; 赠送源代码:struts2-json-plugin-2.3.24-sources.jar; 赠送Maven依赖信息文件:struts2-json-plugin-...
struts2-spring-plugin-2.3.15.2.jar ; struts2-json-plugin-2.3.16.3.jarstruts2-spring-plugin-2.3.15.2.jar ; struts2-json-plugin-2.3.16.3.jar
struts2-json-plugin,Struts JSON插件
`struts2-json-plugin-2.1.8.1.jar` 则是Struts 2框架的一个插件,主要用于增强Struts 2对JSON的支持。Struts 2是一款非常流行的MVC(Model-View-Controller)框架,用于构建企业级的Java Web应用程序。这个插件允许...
`struts2-json-plugin`是Struts2的一个插件,它使得Struts2能够处理JSON请求和响应,无需额外的配置或库。这个插件不仅包含了源码,还包含了必要的配置文件和类,使得开发者可以深入理解其工作原理并进行自定义扩展...
在实际开发中,为了使用这个插件,你需要将`struts2-json-plugin-2.3.8.jar`文件放入项目的类路径(classpath)下,然后在Struts2的配置文件(通常为struts.xml)中启用JSON插件。在Action类中,定义返回JSON数据的...
struts2自带的json转换 倒入jar文件 struts.xml中 <package ......extends="json-default" <result type="json"/>
struts2-json-plugin-2.2.3.1能用的包
struts2-json-plugin-2.3.15.1 -Lee修复bug版.jarstruts2-json-plugin-2.3.15.1 -Lee修复bug版.jarstruts2-json-plugin-2.3.15.1 -Lee修复bug版.jarstruts2-json-plugin-2.3.15.1 -Lee修复bug版.jar
ajax结合Struts2要用到的jar包
struts2 2.3.16.3 版本配置json所需要的jar文件。有时候版本不一致也会配置失败。
这个压缩包包含了两个关键的组件:json-lib-2.1.jar和struts2-json-plugin-2.1.8.1.jar,它们是Struts2支持JSON(JavaScript Object Notation)序列化和反序列化的关键。 1. **json-lib-2.1.jar**: JSON是一种轻...
struts2-json-plugin-2.3.24.jar
struts2-struts1-plugin-2.1.6.jar
Struts2 JSON Plugin是Apache Struts框架的一个扩展插件,主要功能是支持Struts2应用程序与JSON(JavaScript Object Notation)格式的数据进行交互。JSON是一种轻量级的数据交换格式,广泛用于Web服务和AJAX...
标题"struts2-json-plugin-2.1.8.1.jar"表明这是Struts2 JSON插件的一个特定版本,2.1.8.1。在软件开发中,版本号的更新通常意味着修复了已知的错误,增加了新的特性,或者提高了性能。 "JsonPlugin.tld"是Tag ...
struts2-json-plugin-2.3.28.1.
首先,我们来看`struts-json-plugin-2.1.8.jar`,这是Struts2的JSON插件,它允许Struts2的动作类直接返回JSON格式的数据,方便前端进行Ajax请求处理。该插件在2.1.8版本中修复了若干bug,并提供了对JSON输出的支持。...