Struts返回JSON不被序列化 注意点

本文介绍了如何使用 Struts 框架返回 JSON 数据,并列举了几项关键配置步骤,包括注解使用、包继承、编码设置及 Model 的权限控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Struts可以返回为JSON的形式。

文档
中文文档:http://webservices.ctocio.com.cn/tips/424/7670924.shtml
英文文档:http://cwiki.apache.org/S2PLUGINS/json-plugin.html(详细些)

有几个需要注意的地方:
1: 如果不序列化某个属性需要在get方法上加入@JSON(deserialize=false,serialize=false)注释。
2: struts2.0包必须继承json-default,<package name="default" extends="json-default">
3:struts设置为UTF-8 , <constant name="struts.i18n.encoding" value="UTF-8" /> (这个好像不用改,我改了页面反而显示不出来了)
4: Model的访问控制符必须是public的,public static class Model
5:设置返回类型为:json
<action name="knowledgeAction" class="KnowledgeAction">
       <result type="json" >
      </result>
</action>

 

from:http://kiral.javaeye.com/blog/255476

<think>嗯,用户遇到了Struts2JSON序列化对象时某个属性出错的问题。首先,我需要回忆一下Struts2处理JSON序列化的机制。Struts2通常使用集成库如struts2-json-plugin来处理对象的序列化,这个插件底层可能依赖Jackson或者其他的JSON库。 用户提到某个属性出错,可能的原因有几个方面。比如,属性对应的字段可能存在循环引用,导致序列化时无限递归;或者属性类型JSON库支持,比如某些自定义类或序列化的类型;还有可能是属性本身存在空值,而序列化配置允许空值输出;另外,getter方法命名规范也可能导致反射调用失败。 接下来,我需要逐一分析这些可能性并提供解决方案。首先想到的是使用注解来忽略特定的属性。在Java中,Jackson库提供了@JsonIgnore注解,可以直接加在需要忽略的字段或getter方法上。这样在序列化时就会跳过该属性。另外,@JsonIgnoreProperties注解可以在类级别使用,指定需要忽略的属性名列表,这样可以避免修改多个地方的代码。 然后是配置方面的调整。Struts2json插件允许在配置文件中设置排除的属性,比如在struts.xml中通过<param name="excludeProperties">propertyName</param>来排除特定的属性。这种方法需要修改Java代码,适用于快速解决问题。另外,检查是否有未知属性导致的错误,可以通过配置ObjectMapper的FAIL_ON_UNKNOWN_PROPERTIES为false,但需要注意这可能隐藏其他潜在问题。 另外,检查属性类型是否可序列化也很重要。比如,如果属性是一个自定义类,需要确保这个类中的所有字段也都是可序列化的,或者有相应的类型适配器。对于日期类型的属性,可能需要指定格式,避免序列化失败。此外,空值处理可以通过@JsonInclude注解来控制在什么情况下包含该属性,避免因为null值导致错误。 还需要考虑是否有循环引用的问题。比如,两个类相互引用,序列化时会陷入无限循环。这时可以使用@JsonManagedReference和@JsonBackReference注解来打破循环,或者在配置中启用循环引用的处理功能。 最后,日志分析也是关键步骤。查看应用服务器的日志,找到具体的错误信息,比如堆栈跟踪,这能帮助更精确地定位问题所在。例如,如果日志中显示无法序列化某个类型的属性,那么就需要针对该类型进行处理。 在验证解决方案时,建议用户先尝试使用注解或配置排除问题属性,确保最小化修改,并逐步测试其他方法。同时,注意同版本的Struts2JSON插件可能有同的配置方式,需要参考官方文档进行调整。 总结下来,解决方案可能涉及注解使用、配置文件调整、类型检查以及日志分析。需要根据具体情况选择合适的方法,或者多种方法结合使用。如果用户提供了具体的错误信息,可以更精准地推荐解决步骤。</think>### Struts2 JSON序列化属性错误解决方案 在Struts2框架中,JSON序列化属性错误通常由字段类型兼容、循环引用或配置当引起。以下是分步解决方案: --- #### 1. **使用注解忽略属性** 通过`@JsonIgnore`或`@JsonIgnoreProperties`注解直接排除问题字段: ```java public class User { @JsonIgnore // 忽略单个属性 private String sensitiveData; @JsonIgnoreProperties({"password", "secretKey"}) // 类级别忽略多个属性 public class Account { ... } } ``` 此方法适用于快速定位问题属性[^1]。 --- #### 2. **配置struts.xml排除属性** 在Struts2的配置文件中指定排除字段: ```xml <action name="userAction" class="com.example.UserAction"> <result type="json"> <param name="excludeProperties"> user.sensitiveData, user.nestedObject.* </param> </result> </action> ``` 支持通配符匹配多级属性。 --- #### 3. **处理循环引用** 若属性涉及双向关联(如父子关系),使用Jackson注解标记主从关系: ```java public class Parent { @JsonManagedReference private List<Child> children; } public class Child { @JsonBackReference private Parent parent; } ``` 或全局配置序列化特性: ```java ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); ``` --- #### 4. **类型适配与空值处理** - **日期格式化**:使用`@JsonFormat`指定格式 ```java @JsonFormat(pattern="yyyy-MM-dd") private Date birthDate; ``` - **忽略空值**:通过`@JsonInclude`控制空值行为 ```java @JsonInclude(Include.NON_NULL) private String optionalField; ``` --- #### 5. **日志分析与堆栈定位** 查看服务器日志中的具体异常信息: - 若出现`com.opensymphony.xwork2.util.XStreamWrapper$XStreamHandler$1 cannot be cast to java.io.Externalizable`,需检查是否混用了序列化库。 - 若提示`No serializer found for class X`,需为序列化类型(如JDBC Connection)添加`transient`关键字或排除该字段。 --- #### 验证步骤 1. 在`struts.xml`中启用开发模式: ```xml <constant name="struts.devMode" value="true" /> ``` 2. 使用Postman发送请求,观察JSON响应是否过滤目标属性。 3. 逐步恢复被排除属性,定位具体出错字段。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值