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
。
obj
是getModel()
返回的值,在你的情况下它将是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
注释。