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

我正在使用实现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类中的模型对象具有所有可用数据,但我尝试返回模型或项目对象,但两者都不起作用。

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

如果obj是数组或列表,则此处理程序使用JSONArray.fromObject(obj)否则使用JSONObject.fromObject(obj)来获取可以序列化并写入响应的JSONObejct

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

因为JsonLibHandler使用默认的JsonConfig ,所以除非它们是public字段,否则不能从要序列化的bean中排除属性。

可以使用JsonConfig为json-lib的以下function提供JsonConfig

  • 循环检测,有两种默认策略(默认抛出exception),可以自己注册
  • 在seratilizing为JSON时跳过瞬态字段(默认=不跳过)当serailizing为JSON时跳过JAP @Transient注释方法(默认=不跳过)
  • 在seratilizing为JSON时排除bean属性和/或映射键(默认= [‘class’,’metaClass’,’declaringClass’])
  • filter提供了更精细的细节,用于在序列化为JSON或转换回Java时排除/包含属性

您可以找到允许您排除某些属性的代码段 。

排除属性

 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") ); 

排除属性(使用filter)

 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库来处理请求。 如文档页面中所述: 使用Jackson框架作为JSON ContentTypeHandler

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

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

  org.codehaus.jackson jackson-jaxrs 1.9.13  

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

       

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