您的位置:首页 > 编程语言 > Java开发

Extjs+structs2+spring+ibatis js调Action的方法内使用了spring注入的对象null的解决方案

2012-09-28 11:05 357 查看
背景:最近需要急速开发一个web聊天室,但是总出现spring注入对象空指针的情况,描述如下:

dwr.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="MessageActionJS">
<param name="class" value="com.downjoy.app.chatsystem.common.action.MessageAction" />
</create>

<create creator="new" javascript="UserActionJS">
<param name="class" value="com.downjoy.app.chatsystem.common.action.UserAction" />
</create>

<!-- when an object(bean) was used as a parameter, it should be coverted like this -->
<convert converter="bean" match="com.downjoy.app.chatsystem.common.to.SessionMessageTO" />
<convert converter="bean" match="com.downjoy.app.chatsystem.common.to.OnlineUserTO" />

</allow>
</dwr>


structs.xml中

<!-- 用户管理 -->
<action name="login" class="userAction" method="login">
<result name="success" type="redirect">jsp/chat.jsp</result>
<result name="input">index.jsp</result>
</action>

<action name="logout" class="userAction" method="logout">
<!-- <result type="redirect">index.jsp</result> -->
</action>


spring配置
<bean name="userAction" class="com.downjoy.app.chatsystem.common.action.UserAction" scope="prototype">
<property name="userService" ref="userService" />
</bean>

<bean name="treeProAction" class="com.downjoy.app.chatsystem.common.action.TreeProAction" scope="prototype"/>

<bean name="messageAction" class="com.downjoy.app.chatsystem.common.action.MessageAction" scope="prototype">
<property name="messageService" ref="messageService" />
</bean>  <bean id="messageDAO" class="com.downjoy.app.chatsystem.common.dao.ibatis.MessageDAOImpl"/>

<bean id="userDAO" class="com.downjoy.app.chatsystem.common.dao.ibatis.UserDAOImpl"/>

<bean id="messageService" class="com.downjoy.app.chatsystem.common.service.MessageServiceImpl">
<property name="messageDAO" ref="messageDAO"/>
</bean>

<bean id="userService" class="com.downjoy.app.chatsystem.common.service.UserServiceImpl">
<property name="userDAO" ref="userDAO"/>
</bean>



UserAction中

private UserService userService;public void setUserService(UserService userService) {
this.userService = userService;
System.out.println("----UserService insertted---");
}




MessageAction中
private MessageService messageService;
public void setMessageService(MessageService messageService) {
this.messageService = messageService;
System.out.println("insert MessageService ok++++++++++++++");
}


启动服务器,显示:
-----UserDAO inserted ok------

----UserService insertted---

1.问题:User和Message同样的配置,但是只有User被注入进来了。

刚开始以为是配置的代码里面有什么小的出入,仔细比对后并没有发现什么异常。后来发现之所以在启动服务器的时候UserAction会被注入,是因为在structs.xml中使用到了UserAction。所以在启动时就注入了UserService。

尝试:在structs.xml中加入类似的代码,也引入MessageAction,一边其注入MessageService.

<action name="addPublicMessage" class="messageAction" method="addPublicMessage"/>


重启服务器,显示:
信息: Initializing Spring root WebApplicationContext

---MessageDAO insertted ok----

-----UserDAO inserted ok------

----UserService insertted---

insert MessageService ok++++++++++++++

2012-9-28 10:26:01 org.apache.coyote.http11.Http11Protocol start

2.问题:现在两个Service是被注入了,但是登录进入聊天室以后,发现在MessageService对象还是空指针。

尝试:既然在程序启动的时候已经注入了,现在却又变成null,说明这两次用的不是同一个UserService对象,何不将其设置为static呢,这样在启动服务器的时候就行,以后就再也不用担心了,MessageAction修改如下:

private static MessageService messageService;


再次重启服务器,运行,一切OK!
提示:(之所以在UserAction中 设置static 是因为程序是通过structs调用的UserAction中的对象,而在服务器启动时候已经注入了userService,所以可以用;然而,使用MessageService的addPublicService方法时,是使用extjs内部ajax机制,使用的messageService和Structs注入的不是同一个对象,所以会报空指针,设置成为静态后,就行了)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐