由于之前合并了流程及表單分類,在進階查詢和流程管理頁面打開z-tree樹時,前端頁面報出queryAllCategory()的空指針異常(逐漸調試後在該方法中無空指針異常),并報如下錯誤:
[16/06/14 07:30:07:007 CST] DEBUG sql.Connection: xxx Connection Closed
org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.apache.ibatis.transaction.managed.ManagedTransactionFactory and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: $Proxy189["targetSource"]->org.springframework.aop.target.SingletonTargetSource["target"]->com.fx.oa.module.bpm.workflow.server.service.impl.ProcessDefineService["orgDao"]->com.fx.oa.module.com.dependence.server.dao.impl.OrgDao["sqlSession"]->org.mybatis.spring.SqlSessionTemplate["sqlSessionFactory"]->org.apache.ibatis.session.defaults.DefaultSqlSessionFactory["configuration"]->org.apache.ibatis.session.Configuration["environment"]->org.apache.ibatis.mapping.Environment["transactionFactory"])
異常分析:
1.同樣使用z-tree展示,建立任務頁面沒有出現異常,可以将流程分類展示出來;
2.進階查詢和流程管理頁面均有如上問題;
解決思路:
1.懷疑代碼錯誤,先檢查流程管理送出的代碼,發現沒有修改或修改不影響該功能;
2.根據以下關鍵字org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.apache.ibatis.transaction.managed查詢到可能與複雜json對象(包括一對多屬性,分類使用的樹結構,包括孩子屬性List<CategoryEntity>)解析有關,連結1:http://redsky008.iteye.com/blog/1345279,連結2:http://chembo.iteye.com/blog/899703,按照連結所示方法即為複雜json對象@JsonIgnore注解,該方法對此bug無效;
3.建立工作(NT)與流程管理(BM)、進階查詢(SQ)的樹展示方式相似,将NT的實作copy到BM和SQ,發現可以展示分類,但分類下未展示流程結點:三者展示方式相似,但并不完全相同,NT将背景查詢的分類及結點隻展示了分類,其他兩個展示到葉子結點;
4.NT使用了表單下的分類查詢(包括葉子)(/dymcform/queryAllCategory),BM、SQ使用的流程下的分類查詢(包括葉子)(/workflow/queryAllCategory),合并後兩者實作完全相同,但action不同,一個是表單下的dymcformAction,一個是流程下的flowDesignAction;更換後不再報異常,但并未達到展示葉子的效果;
5.仔細分析異常,發現報出ProcessDefineService下的orgDao錯誤,觀察後發現flowDesignAction下的processDefineService有get方法,ProcessDefineService下的orgDao也有get方法,這在struts2、Spring中是不被推薦的,原因是Spring在action對service做了IOC,在service又對dao做了IOC,如果在action層又有service的getter或service層又有dao的getter方法,會出現每次action調用結束,會繼續調用get**Service方法,繼而會調用該service的get**DAO方法,進而産生了上述錯誤。
6.将action中對service,service中對dao的getter方法去掉,bug解決。
本文轉自 gaochaojs 51CTO部落格,原文連結http://blog.51cto.com/jncumter/1427243:,如需轉載請自行聯系原作者