我正在使用实现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类中的模型对象具有所有可用数据,但我尝试返回模型或项目对象,但两者都无效。
答案 0 :(得分:1)
默认情况下,Struts2 REST插件使用json-lib来序列化您的bean。如果您使用的是ModelDriven
,那么它会在处理结果时直接访问您的模型。由于您在请求URL中使用扩展名.json
,因此扩展名将选择内容类型处理程序。它应该是JsonLibHandler
。
如果JSONArray.fromObject(obj)
是数组或列表,则此处理程序使用obj
;否则JSONObject.fromObject(obj)
使JSONObejct
可以序列化并写入响应。{/ p >
obj
是getModel()
返回的值,在您的情况下,它将是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
注释。