`
hanjk1234
  • 浏览: 2336 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

对 jsonplugin的修改,消除了,与Hibernate 结合是no session的问题

阅读更多
下面说明一下,修改的功能,和方法,如有不对的地方多多包涵
小弟是菜鸟,拍砖就免了,希望大家提一些好的建议,并帮忙测试我好优化

发一个正常零配置的 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,
分享到:
评论

相关推荐

    jsonplugin, 对 struts2.1.X版本jsonplugin-0.34.jar 的修改

    第一次上传,要5分,是物有所值,处理了jsonplugin 的no session的问题,并且添加了,新的注释,例如 @JSON(exclude='对象的名称') 就可以剔除 解决json与Hibernate之间的大部分问题 1.数据只取三层 2.对one-ton-many ,...

    jsonplugin.jar包

    jsonplugin-0.32.jar jsonplugin.jar包

    jsonplugin

    java structs jsonplugin

    jsonplugin-0.33.jar

    因此,在升级或降级Struts2框架时,需要确保JSONPlugin版本与之匹配,以避免可能出现的不兼容问题。 总的来说,JSONPlugin-0.33.jar是Struts2框架的一个强大扩展,它简化了JSON数据处理,提高了Web应用的交互性和...

    JsonPlugin

    JsonPlugin 是一个专门为游戏开发或软件工程设计的插件,其主要功能是处理 JSON(JavaScript Object Notation)数据。JSON 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在游戏开发中...

    jsonplugin-0.32.jar

    JSONPlugin是针对Struts2框架的一个插件,主要用于在Struts2应用中处理JSON(JavaScript ...在实际开发中,结合JSONPlugin可以有效地提升开发效率,优化用户体验,特别是在需要频繁进行异步数据交互的应用场景下。

    jsonplugin插件

    JSONPlugin插件是针对Struts2.1.8框架的一个扩展,主要目的是为了方便地将Java对象转换为JSON(JavaScript Object Notation)格式的数据,以便与ExtJS这样的前端JavaScript库进行交互。在Web开发中,JSON作为一种轻...

    JSONPLUGIN源码

    JSONPLUGIN源码是针对Struts2框架的一个插件,主要用于处理JSON数据的解析和序列化。...此外,理解这一插件的工作原理也有助于扩展其他功能,例如增加自定义的JSON序列化策略,或是与其他技术(如WebSocket)结合使用。

    jsonplugin-0.31.jar

    jsonplugin-0.31.jar 使用JSON的一个架包.

    jsonplugin源码包

    这个源码包提供了深入理解Struts2框架与JSON处理机制的机会,对于想要提升Java Web开发技能,特别是对Struts2和JSON有研究需求的开发者来说,极具价值。 首先,我们来看`JsonPlugin.tld`文件。TLD(Tag Library ...

    jsonplugin-0.7.jar

    struts2后台直接返回json对象,ajax开发必备

    Jsonplugin结合struts2使用说明

    在提供的文档《Struts2_Jsonplugin_详解.doc》和《JsonPlugin 使用.docx》中,你应该能找到更具体的使用示例和详细配置信息。这些文档可能涵盖了如何处理集合类型、自定义类型转换器、错误处理以及与其他Struts2功能...

    json资源jsonplugin-0.33,2.1.8,2.1.6

    描述中提到了"包含各种json资源包",这可能意味着这个压缩包包含了多种与JSON处理相关的库或者工具,比如gson-1.6.jar。Gson是Google提供的一个Java库,它能够将Java对象转换为JSON字符串,反之也能将JSON文本转换回...

    jsonplugin-0.32.jar 1268047053905-integrated.jnlp

    1268047053905-integrated.jnlp jsonplugin-0.32.jar

    jsonplugin+json.jar

    JSONplugin+json.jar是针对JSON处理的一个插件,通常包含了一些方便开发者处理JSON数据的工具和类库。 在Java开发环境中,当我们需要处理JSON数据时,通常会引入像json.jar这样的第三方库。这个jar包可能包含了如下...

    jsonplugin-jtds-ojdbc等jar包

    标题中的"jsonplugin-jtds-ojdbc等jar包"提到了三个关键的Java库,它们在IT领域,尤其是在Java应用程序开发中,具有重要的作用。让我们逐一解析这些库的用途和重要性。 首先,"jsonplugin"可能指的是一个处理JSON...

    struts2 的jar包jsonplugin-0.33.jar包

    总的来说,`jsonplugin-0.33.jar`是Struts2框架中处理JSON数据的关键组件,它简化了服务器端与客户端之间的JSON数据交换,使得基于Struts2的Web应用能更好地支持现代Web开发需求。同时,了解如何配置和利用这个插件...

    jsonplugin(struts2.0)

    JSONPlugin是Struts2框架的一个插件,主要目的是为了支持JSON(JavaScript Object Notation)格式的数据交换,使得Struts2的应用能够与前端进行高效的JSON通信。JSON作为一种轻量级的数据交换格式,因其易于人阅读和...

    json 最新依赖包 jsonplugin-0.34, json-lib-2.3-jdk15,ezmorph-1.0.6

    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

Global site tag (gtag.js) - Google Analytics