下面说明一下,修改的功能,和方法,如有不对的地方多多包涵
小弟是菜鸟,拍砖就免了,希望大家提一些好的建议,并帮忙测试我好优化
发一个正常零配置的 struts 代码
@ParentPackage("json-default")
@Result(type="json", name = "success")
public class ProvinceJsonAction extends PersistAction <Province>{
private static final long serialVersionUID = -3508124153476681702L;
private List <Province> provinces;
@Autowired
private ProvinceService provinceService;
public String getProvincesJson() {
provinces = provinceService.findAll();
return SUCCESS;
}
@JSON
public List <Province> getProvinces() {
return provinces;
}
public void setProvinces(List <Province> provinces) {
this.provinces = provinces;
}
}
正常情况下, struts的jsonplugin能帮我们把provinces ,或者其他的对象转为json,
并发送到前台,他已经帮我们实现了很好了
但是,有时候,需求,还是不能满足,
1. 当你封装的对象,比如Province ,里面的还有city,school, teacher,等,对象
当你只需要Province,city ,school ,不需要teacher的时候,你需要在school 里面getTeacher() 方法上面
配置@JSON(serialize=false) ,但是请注意,你用了hibernate,teacher是一个底层实体 ,
当你取其他对象的时候,级联了school,也需要teacher,并且,这个teacher 是必须的时候??
你是无法取出的,因为你已经配置了,
2 .Hibernate的查询(q.)一般默认为三层,但是,jsonplugin 是把你的所有对象都给找出来,
这个时侯很容易造成数据冗余,我就是为了要Province ,
但是他吧city ,school,也给我了,我不需要啊,你或许说,恩可以配置,@JSON(serialize=false) ,请看问题1
3 ,jsonplugin 对Hibernate one-to -many,one-to-one 的处理,存在一点小问题,
当他们配置为lazy的时候,jsonplugin处理的方式是,抛出异常
下面是我对他的修改,希望大家,多多提意见
为json.java 添加一个属性
package com.googlecode.jsonplugin.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface JSON {
String name() default "";
String exclude() default "";
boolean serialize() default true;
boolean deserialize() default true;
String format() default "";
}
新增加exclude()
//这个意思你不需要在Hibernate实体bean里面配置@json(serialize=false)
// 在当前action配置就可以
@JSON(exclude="city,school")
public List <Province> getProvinces() {
return provinces;
}
他忽略 Province下的city,school,
修改jsonWriter.java ,源代码就不全发了,太长,有兴趣的,可以自己去下
private Integer acount = 1 ;
private String excludeBean = "" ;
/**
* Instrospect bean and serialize its properties
*/
private void bean(Object object) throws JSONException {
/**
*当大于四层的时候,忽略
*/
if(this.acount>4) {
log.warn(" bean name["+object.getClass().getName()+"]beyond 4 level ,has ignore ");
this.add(null) ;
return ;
}
this.add("{");
BeanInfo info;
try {
Class clazz = object.getClass();
info = ((object == this.root) && this.ignoreHierarchy) ? Introspector
.getBeanInfo(clazz, clazz.getSuperclass()) : Introspector
.getBeanInfo(clazz);
PropertyDescriptor[] props = info.getPropertyDescriptors();
boolean hasData = false;
for (int i = 0; i < props.length; ++i) {
PropertyDescriptor prop = props[i];
String name = prop.getName();
Method accessor = prop.getReadMethod();
Method baseAccessor = null;
/*
* jsonplugin已经解决了一部分问题...clazz.getName().indexOf("$$EnhancerByCGLIB$$") > -1
*但是还不够
*/
if (clazz.getName().indexOf("$$EnhancerByCGLIB$$") > -1) {
try {
baseAccessor = Class.forName(
clazz.getName().substring(0, clazz.getName().indexOf("$$")))
.getMethod(accessor.getName(), accessor.getParameterTypes());
} catch (Exception ex) {
log.debug(ex.getMessage(), ex);
}
} else
baseAccessor = accessor;
if (baseAccessor != null) {
JSON json = baseAccessor.getAnnotation(JSON.class);
if (json != null) {
if (!json.serialize())
continue;
if (json.name().length() > 0)
name = json.name();
/*
* 取出曾经添加的忽略的属性
*/
else if(json.exclude().length()>0) {
this.excludeBean += json.exclude()+","
}
}
//忽略
if(excludeBean.length()>0) {
if(name.indexOf(excludeBean)>-1) {
log.debug("excludeBean["+name+"] ignore") ;
continue;
}
}
//ignore "class" and others
if (this.shouldExcludeProperty(clazz, 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, new Object[0]);
//计数
this.acount+=1;
//当one-to-one的时候,value的值的格式,(去不出来) ,设置为空
if(value!=null) {
if(value.getClass().getName().indexOf("$$EnhancerByCGLIB$$") > -1){
log.debug("hibernate one to one ,name["+name+"] set value=null");
value = null;
}
}
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) {
throw new JSONException(e);
}
this.add("}");
}
/**
* Add name/value pair to buffer
*/
private boolean add(String name, Object value, Method method, boolean hasData) throws JSONException {
if (!excludeNullProperties || value != null) {
if (hasData) {
this.add(',');
}
this.add('"');
this.add(name);
this.add("\":");
//当value 是one-to-mang的hashset的集合时,设为null
if(value instanceof PersistentSet){
log.debug("hibernate one-to -many,name["+name+"] set value =null") ;
this.value(null, method) ;
}else{
this.value(value, method) ;
}
//计数
this.acount-=1;
return true;
}
return false;
}
----------------end------------------------------------
这样子,就可以解决json与Hibernate之间的大部分问题
1.数据只取三层
2.对one-ton-many ,one-to-one ,值设为null(被设置为延迟加载的时候)
3.不需要配置底层实体,在当前action配置就可以
恩,希望大家帮帮测试,谢谢了
我的邮箱hanjk1234@163.com,
分享到:
相关推荐
第一次上传,要5分,是物有所值,处理了jsonplugin 的no session的问题,并且添加了,新的注释,例如 @JSON(exclude='对象的名称') 就可以剔除 解决json与Hibernate之间的大部分问题 1.数据只取三层 2.对one-ton-many ,...
jsonplugin-0.32.jar jsonplugin.jar包
java structs jsonplugin
因此,在升级或降级Struts2框架时,需要确保JSONPlugin版本与之匹配,以避免可能出现的不兼容问题。 总的来说,JSONPlugin-0.33.jar是Struts2框架的一个强大扩展,它简化了JSON数据处理,提高了Web应用的交互性和...
JsonPlugin 是一个专门为游戏开发或软件工程设计的插件,其主要功能是处理 JSON(JavaScript Object Notation)数据。JSON 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在游戏开发中...
JSONPlugin是针对Struts2框架的一个插件,主要用于在Struts2应用中处理JSON(JavaScript ...在实际开发中,结合JSONPlugin可以有效地提升开发效率,优化用户体验,特别是在需要频繁进行异步数据交互的应用场景下。
JSONPlugin插件是针对Struts2.1.8框架的一个扩展,主要目的是为了方便地将Java对象转换为JSON(JavaScript Object Notation)格式的数据,以便与ExtJS这样的前端JavaScript库进行交互。在Web开发中,JSON作为一种轻...
JSONPLUGIN源码是针对Struts2框架的一个插件,主要用于处理JSON数据的解析和序列化。...此外,理解这一插件的工作原理也有助于扩展其他功能,例如增加自定义的JSON序列化策略,或是与其他技术(如WebSocket)结合使用。
jsonplugin-0.31.jar 使用JSON的一个架包.
这个源码包提供了深入理解Struts2框架与JSON处理机制的机会,对于想要提升Java Web开发技能,特别是对Struts2和JSON有研究需求的开发者来说,极具价值。 首先,我们来看`JsonPlugin.tld`文件。TLD(Tag Library ...
struts2后台直接返回json对象,ajax开发必备
在提供的文档《Struts2_Jsonplugin_详解.doc》和《JsonPlugin 使用.docx》中,你应该能找到更具体的使用示例和详细配置信息。这些文档可能涵盖了如何处理集合类型、自定义类型转换器、错误处理以及与其他Struts2功能...
描述中提到了"包含各种json资源包",这可能意味着这个压缩包包含了多种与JSON处理相关的库或者工具,比如gson-1.6.jar。Gson是Google提供的一个Java库,它能够将Java对象转换为JSON字符串,反之也能将JSON文本转换回...
1268047053905-integrated.jnlp jsonplugin-0.32.jar
JSONplugin+json.jar是针对JSON处理的一个插件,通常包含了一些方便开发者处理JSON数据的工具和类库。 在Java开发环境中,当我们需要处理JSON数据时,通常会引入像json.jar这样的第三方库。这个jar包可能包含了如下...
标题中的"jsonplugin-jtds-ojdbc等jar包"提到了三个关键的Java库,它们在IT领域,尤其是在Java应用程序开发中,具有重要的作用。让我们逐一解析这些库的用途和重要性。 首先,"jsonplugin"可能指的是一个处理JSON...
总的来说,`jsonplugin-0.33.jar`是Struts2框架中处理JSON数据的关键组件,它简化了服务器端与客户端之间的JSON数据交换,使得基于Struts2的Web应用能更好地支持现代Web开发需求。同时,了解如何配置和利用这个插件...
JSONPlugin是Struts2框架的一个插件,主要目的是为了支持JSON(JavaScript Object Notation)格式的数据交换,使得Struts2的应用能够与前端进行高效的JSON通信。JSON作为一种轻量级的数据交换格式,因其易于人阅读和...
commons-beanutils-1.8.0 commons-collections-3.2 commons-lang-2.4 commons-logging-1.1 ezmorph-1.0.6 json-lib-2.3-jdk15 jsonplugin-0.34