Experience Serializable transient,输入输出流,反照应用
需求:
有好几个功能模块都需要审核的功能。
例如:
在功能模块A中填写了表单,并保存提交了,待审核过后才能有效。
在功能模块B中同样如此
在功能模块C中同样也是如此
这些都需要在审核功能模块审核通过后方能生效。
分析问题:
或许一拿到这样的需求,设计的时候都会在数据库表中增加一个状态字段来表示审核成功还是失败。如果这样做的话,那么审核的时候,必须选择功能模块类型,然后查询相应需要审核的记录,进行审核,如果不选择审核类型进行查询而是查询所有审核信息,则要遍历多张表。再增加一个功能模块的时候,要在审核这里再做修改。相当于审核的功能都渗透到其他功能模块中去了,一旦需求变更的时候,修改就比较多,模块之间依赖程度太高。
提出问题,解决问题:
增加表字段的方法可以解决问题,但感觉不是很好。应该把审核的功能独立出来,可以设计一张审核表,审核的信息只从审核表中查询,待审核通过后,将数据插入到相应的功能模块x表中。
问题1:各个不同模块的内容怎么在一张审核表中进行存储,审核的时候怎么查看 ?
在各种模块中,提交的时候,将po转换成二进制流存储在数据库中,该字段设置成大字段类型 blog(mysql),只需要审核表定义一个这样的字段就可以存储各个不同模块的数据。
问题2:查看各模块的详细信息并修改,怎么处理?
查询详细的时候,可以通过审核id在审核的Controller层获取到审核具体的内容,问题是,获取到内容后怎么跳转到相应功能模块的详细页面,不同的功能有不同的详细页面。
我们得有一个数据类型,通过数据类型来判断是哪个功能模块,然后在配置文件中配置相应的url,在审核控制层进行读取配置文件进行跳转就ok了。
例如:
audit.detail.1=bbsdetail.do // 跳转到bbsdetail.do
audit.detail.2=newsdetail.do // 跳转到newsdetail.do
第三个参数是数据类型1=bbs,2=news
修改信息的时候:
修改的时候应该跟查询一样
audit.modify.1=bbsmodify.do // 跳转到bbsmodify
audit.modify.2=newsmodify.do //跳转到newsmodify
第三个参数是数据类型1=bbs,2=news
问题3: 审核通过之后,实际功能模块的信息怎么入库?
审核通过后:
在审核模块中取到具体po后将二进制流还原成po,原来的po重生了,通过配置文件取到各个模块的service,进入相应的模块的service层的方法进行处理即可。
怎么跳?
在配置文件中配置:
audit.dealService.1=bbsService
audit.dealService.2=newsService
第三个参数是数据类型
audit.auditmethod.1.1 = addbbs
audit.auditmethod.1.2 = addnews
第三个参数是操作类型1=add,2=modify
第四个参数是数据类型1=bbs,2=news
整个思路流程到此为止。
用的技术点:
1、序列化,输入/输出流: 将po对象转换成二进制流并保存起来,将二进制流还原成对象。
Serializable串行化,输入输出流 可参考 http://blog.****.net/hbcui1984/archive/2007/04/02/1549290.aspx
2、反射: 得到对象实例xxxService,知道方法名称。
Method method = service.getClass().getMethod(dealmethod, new Class[]{obj.getClass()});
Object result = method.invoke(service, obj);