NutzCN Logo
问答 依赖注入第一次可以,第二次就为null
发布于 2798天前 作者 蛋蛋的忧伤 1875 次浏览 复制 上一个帖子 下一个帖子
标签: websocket

我在登陆后执行dao的一个方法改变用户状态为online,然后下线时又调用此函数修改其状态为hide,在dao类里有一个Dao dao属性,采用nutz提供的ioc依赖注入,问题是我第一次调用此方法时dao是有实例的,但是第二次调用此函数时dao就为null,是不是我哪里配置错了

userDaoImpl类:

@IocBean(name="userDao")
public class UserDaoImpl implements UserDao{
	
	@Inject
	private Dao dao;
	
        /**
	 * 更新在线状态
	 */
	@Override
	public void updateStatus(String name) {
		User user = dao.fetch(User.class,Cnd.where(User.USERNAME,"=",name));
		if("online".equals(user.getStatus())){
			user.setStatus("hide");
		}else{
			user.setStatus("online");
		}
		dao.update(user);
	}
}

dao.js

var ioc = {
	   conf : {
            type : "org.nutz.ioc.impl.PropertiesProxy",
            fields : {
                paths : ["custom/"]
            }
        },
        dataSource : {
        	
        	factory:'$conf#make',
        	args : ["com.alibaba.druid.pool.DruidDataSource", "db."],
            type : "com.alibaba.druid.pool.DruidDataSource",
            events : {
                create : "init",
                depose : 'close'
            }
            /*fields : {	
                url : "jdbc:mysql://127.0.0.1:3306/nutzbook",
                username : "root",
                password : "admin",
                testWhileIdle : true, // 非常重要,预防mysql的8小时timeout问题
                //validationQuery : "select 1" , // Oracle的话需要改成 select 1 from dual
                maxActive : 100
            }*/
        },
        dao : {
            type : "org.nutz.dao.impl.NutDao",
            args : [{refer:"dataSource"}]
        }
};
5 回复

登出的时候是怎么做的?贴一下调用的代码

登陆时:

/**
	 * 登陆
	 * @param u
	 * @param session
	 * @return
	 */
	@At
	public Object login(@Param("..")User u,HttpSession session){
		NutMap re = new NutMap();
		User user = userDao.getById(u);
		if(user == null){
			re.setv("ok", false).setv("msg", "用户名或密码错误!");
			return re;
		}else{
			session.setAttribute("me", user.getId());
			session.setAttribute("username", user.getUsername());
			re.setv("ok", true).setv("msg", "登陆成功!");
			userDao.updateStatus(user.getUsername());
			return re;
		}
	}

登出呢是websocket连接关闭时,在close回调里写的,我前台是关闭了浏览器

@IocBean
@ServerEndpoint("/chat")
public class ChatSocket {
	private UserDao userDao = new UserDaoImpl();;    //这里为啥new呢?因为我加上@IocBean也不自动给我注入,所以我就手动new了...
/**
	 * 连接关闭时的回调
	 * @param session
	 */
	@OnClose
	public void close(Session session){
		try {
			session.close();
		} catch (IOException e) {
			System.out.println("我捕获到了异常...");
			e.printStackTrace();
		}
		onlineUsers.remove(this.username);
		userDao.updateStatus(username);//修改在线状态
		System.out.println(username+"下线了...");
		System.out.println("当前在线:"+onlineUsers);
	}
}

你需要 http://nutzam.com/core/mvc/websocket.html

不需要继承AbstractWsEndpoint,但configurator是必须的,如果不想加插件jar,可以直接把NutWsConfigurator拷贝过来用.

ps: 我猜你是发现userDao为null,所以尝试new对象了,那是解决不了问题的。另外,缺了@Inject.

添加回复
请先登陆
回到顶部