struts2中的JSON插件中的一个小猫腻
来源:互联网 发布:传奇屠龙 知乎 编辑:程序博客网 时间:2024/05/14 17:17
在struts2中,对对象进行序列化的过程,往往会有一些控制行为的参数,例如包含什么样的属,不包含什么样的属,根对象等,其中有一个对象值得一提,就是ignoreHierarchy,这个属性设计的初忠是控制在序列化对象的过程中,是否对此对象所继承的属性也进行序列化,例如下面的一段代码:
public abstract class CrudBaseActionSupport<B extends BaseModel<?>> extendsActionSupport implements IDataWrapperProvider<B>, IResultPostProcessor,CoreConstants {public OperatorFunction getOperatorFunction() {return this.crudBaseService.getOperatorFunction(this.getDataWrapper());}public CrudBaseService<B> getCrudBaseService() {return crudBaseService;}public void setCrudBaseService(CrudBaseService<B> crudBaseService) {this.crudBaseService = crudBaseService;}}
另外有一个类如果继承了这个类,那么此类中的属性operatorFunction与crudBaseService这两个属性就会受到ignoreHierarchy配置项的影响,如果ignoreHierarchy=true则在序列化子类对象的时候这两个属性就不会进行序列化,而如果ignoreHierarchy=false则会对这两个属性进行序列化,但这是种控制仅仅限于它的子类对象作为根情况下才适用这一规则,什么意思呢?比如这个类的子类对象它是作为一个列表中的一成员而存在,则这个子类对象两个超类属即使用在ignoreHierarchy=true情况下它仍然会被序列化,关于这一点你一定有小心,不要想当然,认为只要将此属性设置true,就在任何情况下它都不会被序列化.
如果你想在任何情况下都不序列化可以通过两种手段实现:1.使用JSON标注来完成;2.通过excludeProperties属性配置,当然如果你还想达到非常灵活的控制你还可以使用插件提供的桥接标注与接口来完成比较灵活的定制,主要用涉及到的类如下:
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface JSONFieldBridge { Class<? extends FieldBridge> impl() default StringBridge.class; public JSONParameter[] params() default {};}
@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)public @interface JSONParameter { String name();
String value();}
public interface FieldBridge { String objectToString(Object object);}public class StringBridge implements FieldBridge{ public String objectToString(Object object) { if(object==null) return null; return object.toString(); }}public interface ParameterizedBridge {
void setParameterValues(Map<String,String> parameters);}
//这是在桥扩展中最重要的一段代码逻辑,它主用来处理当一个方法被打上桥接标注之后该如何处理序列化的逻辑,对应前台几个接口与标不难看出下面这个方法所完成的事情
private Object getBridgedValue(Method baseAccessor, Object value) throws InstantiationException, IllegalAccessException { JSONFieldBridge fieldBridgeAnn = baseAccessor.getAnnotation(JSONFieldBridge.class); if (fieldBridgeAnn != null) { Class impl = fieldBridgeAnn.impl(); FieldBridge instance = (FieldBridge) impl.newInstance(); if (fieldBridgeAnn.params().length > 0 && ParameterizedBridge.class.isAssignableFrom(impl)) { Map<String, String> params = new HashMap<String, String>(fieldBridgeAnn.params().length); for (JSONParameter param : fieldBridgeAnn.params()) { params.put(param.name(), param.value()); } ((ParameterizedBridge) instance).setParameterValues(params); } value = instance.objectToString(value); } return value; }
- struts2中的JSON插件中的一个小猫腻
- Struts2中的json插件
- c++ switch语句中的猫腻
- struts2中的json
- json字符串转java实体类及属性对应中的猫腻详解
- 藏在UIManager中的猫腻(转)
- SpringMVC学习:redirect URL中的猫腻
- hibernate懒加载中的一些猫腻
- struts2中的dojo插件使用
- 使用struts2中的codebehind插件
- 使用struts2中的codebehind插件
- struts2中的ognl小问题
- ECMAScript6中的一些小知识 json中的键和值一样,可以只写一个
- struts2继承json-default与bean中的boolean的小问题
- JSON在Struts2中的正确玩法
- 议网站建设策划中的三大猫腻
- 世界杯中的一个小国家
- EasyARM1138中的一个小错误
- 简单分析WPF是什么
- URL重写
- 查找某个数据,找到后把符合条件数据的一行复制到另外一个地方
- WPF是什么
- 如何去掉IE 7.0首页设置
- struts2中的JSON插件中的一个小猫腻
- IE7访问HTTPS网站提示证书有安全问题的解决方案
- 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用31
- Linux常用C函数—信号处理篇
- 卫视通:社交电视应用
- redhat linux5 vsftp安装与配置
- 解密回声消除技术之一(理论篇)
- 配置pureftp + mysql 认证登陆
- 解密回声消除技术之二(应用篇)