net.sf.json.JSONException:Struts 2中的层次结构中有一个循环

时间:2016-04-26 17:29:18

标签: jquery json ajax rest struts2

我正在使用实现ModelDriven的Struts类。我能够从jQuery传递数据并将数据保存在数据库中。

当我尝试检索数据并将其传递回jQuery时,我不确定为什么它在jQuery中不可用。我确信我错过了一些基本流程......

这是我的动作类。

public HttpHeaders index() {
    model = projectService.getProjectDetails(project.getUserID());
    return new DefaultHttpHeaders("success").setLocationId("");
} 

@Override
public Object getModel() {
    return project;
}

public Project getProject() {
    return project;
}

public void setProject(Project project) {
    this.project = project;
}

这是我的jQuery

function getProjectDetails() {
    var userID = localStorage.getItem('userID');
    var request = $.ajax({
        url : '/SUH/project.json',
        data : {
            userID : userID
        },
        dataType : 'json',
        type : 'GET',
        async : true
    });

    request.done(function(data) {
        console.log(JSON.stringify(data));
        $.each(data, function(index, element) {
            console.log('element project--->' + index + ":" + element);

        });
    });

    request.fail(function(jqXHR, textStatus) {
        console.log('faik');
    });
}

Action类中的模型对象具有所有可用数据,但我尝试返回模型或项目对象,但两者都无效。

1 个答案:

答案 0 :(得分:1)

默认情况下,Struts2 REST插件使用json-lib来序列化您的bean。如果您使用的是ModelDriven,那么它会在处理结果时直接访问您的模型。由于您在请求URL中使用扩展名.json,因此扩展名将选择内容类型处理程序。它应该是JsonLibHandler

如果JSONArray.fromObject(obj)是数组或列表,则此处理程序使用obj;否则JSONObject.fromObject(obj)使JSONObejct可以序列化并写入响应。{/ p >

objgetModel()返回的值,在您的情况下,它将是project

由于JsonLibHandler使用的是默认JsonConfig,因此您不能从要序列化的bean中排除属性,除非它们是public个字段。

json-lib的以下功能可以使用JsonConfig

  
      
  • 循环检测,有两种默认策略(默认抛出   例外),您可以注册自己的
  •   
  • 跳过瞬态字段时   serailizing to JSON(默认=不跳过)跳过JAP @Transient注释   seratilizing为JSON时的方法(默认=不跳过)
  •   
  • 排除豆类   seratilizing到JSON时的属性和/或映射键   (缺省值= ['类''的metaClass'' declaringClass'])
  •   
  • 过滤器提供了一个   序列化时排除/包含属性的更详细   JSON或转换回Java
  •   

您可以找到允许您排除某些属性的code snippets

  

排除属性

String str = "{'string':'JSON', 'integer': 1, 'double': 2.0, 'boolean': true}";  
JsonConfig jsonConfig = new JsonConfig();  
jsonConfig.setExcludes( new String[]{ "double", "boolean" } );  
JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON( str, jsonConfig );  
assertEquals( "JSON", jsonObject.getString("string") );        
assertEquals( 1, jsonObject.getInt("integer") );        
assertFalse( jsonObject.has("double") );     
assertFalse( jsonObject.has("boolean") );     
     

排除属性(带过滤器)

String str = "{'string':'JSON', 'integer': 1, 'double': 2.0, 'boolean': true}";  
JsonConfig jsonConfig = new JsonConfig();  
jsonConfig.setJsonPropertyFilter( new PropertyFilter(){    
   public boolean apply( Object source, String name, Object value ) {    
      if( "double".equals(value) || "boolean".equals(value) ){    
         return true;    
      }    
      return false;    
   }    
});    
JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON( str, jsonConfig );  
assertEquals( "JSON", jsonObject.getString("string") );        
assertEquals( 1, jsonObject.getInt("integer") );        
assertFalse( jsonObject.has("double") );     
assertFalse( jsonObject.has("boolean") );

但您可以选择使用自己的ContentTypeHandler来覆盖默认值。

另一种方法是使用Jackson库来处理请求。如文档页面中所述:Use Jackson framework as JSON ContentTypeHandler

  

默认的JSON内容处理程序是在JSON-lib之上构建的。如果   您更喜欢使用Jackson框架进行JSON序列化   可以将JacksonLibHandler配置为json的内容处理程序   要求。

     

首先,您需要将jackson依赖项添加到Web应用程序中   通过下载jar文件并将其放在WEB-INF / lib下或通过添加   关注pom.xml中的xml片段到您的依赖项部分   你正在使用maven作为构建系统。

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-jaxrs</artifactId>
    <version>1.9.13</version>
</dependency>
     

现在,您可以使用Jackson内容覆盖内容处理程序   struts.xml中的处理程序:

<bean type="org.apache.struts2.rest.handler.ContentTypeHandler" name="jackson" class="org.apache.struts2.rest.handler.JacksonLibHandler"/>
<constant name="struts.rest.handlerOverride.json" value="jackson"/>

<!-- Set to false if the json content can be returned for any kind of http method -->
<constant name="struts.rest.content.restrictToGET" value="false"/> 

<!-- Set encoding to UTF-8, default is ISO-8859-1 -->
<constant name="struts.i18n.encoding" value="UTF-8"/>

之后,您可以使用@JsonIgnore注释。