NutzCN Logo
问答 nutz-plugins-websocket,自定义WsHandler用不了
发布于 17天前 作者 Yiwill 196 次浏览 复制 上一个帖子 下一个帖子
标签:

jdk1.7 Tomcat8.5,自定义WsHandler用不了,action使用插件里面的msg2room就可以完成通讯。请帮忙看一下是什么问题,代码片段如下:

@ServerEndpoint(value = "/m/websocket/ws",configurator = NutWsConfigurator.class)
@IocBean
public class MyWebSocket extends AbstractWsEndpoint {
@Inject  Dao dao;
    public WsHandler createrHandler(){
        return new MySimpleWsHandler();
    }
}


//自定义wshandler
public class MySimpleWsHandler extends SimpleWsHandler  implements MessageHandler.Whole<String> {
    public MySimpleWsHandler() {
        super("");
    }
    public void msgRoom(final NutMap req) {
        System.out.println("----------------msgRoom...");
        String room =  req.getString("room");
        System.out.println("--------------room:" + room);
        msg2room(req);
    }
25 回复

问题是什么

方法名对应json里面的action

是的,json里面action使用msgRoom时,无法接收消息,后台msgRoom方法里面的打印也没有输出,即该方法没有得到执行。
但是json里面action用您插件里面的msg2room时,就可以正常通讯。
因为需要写一些业务处理,目前卡在自定义的wshandler action 无法使用。这是什么原因呢?

换个名字试试

不加大写字母

sayhi,msg1room,act111等都试过,还是不行,所以才发帖问的。真是好奇怪哦

直接继承 AbstractWsHandler 呢?

debug看看AbstractWsEndpoint的onMessage

直接继承 AbstractWsHandler写自定义就可以,谢谢啦~

直接继承 AbstractWsHandler写自定义就可以,谢谢啦~

看错了,直接继承 AbstractWsHandler也还是不可以┭┮﹏┭┮

MyWebSocket 下复写一下:

@Override
    public void onMesssageString(Session session, String msg) {
        super.onMesssageString(session, msg);

        Logs.get().info("onMessageString, msg: " + msg + ", mSession: " + session);
    }

看看log, 或者直接debug看

debug一下AbstractWsHandler就好了,分发方法都在里面

也许我使用插件的jar包版本问题,查了下AbstractWsEndpoint 默认使用的SimpleWsHandler,我重新写了个AbstractWsEndpoint 既可以啦~
谢谢啦。
不过,现在遇到另一个问题,action里面写sql,debug 查到 dao=null?!检查不到原因,这是为什么呢?(T.(つД)(つД)T)

也许我使用插件的jar包版本问题,查了下AbstractWsEndpoint 默认使用的SimpleWsHandler,我重新写了个AbstractWsEndpoint 既可以啦~
谢谢啦。
不过,现在遇到另一个问题,action里面写sql,debug 查到 dao=null?!检查不到原因,这是为什么呢?(T.(つД)(つД)T)

join action里面写sql也会导致无法通讯,debug 查到 dao=null?这是为什么呢?

action?WsHandler的action类方法?

这个,我自个写的join,当添加dao操作之后就不能通讯。去掉就恢复正常

@InjectName
@IocBean
public class MyWsHandler extends AbstractWsHandler {
@Inject("dao")
     Dao dao;
    @Inject("chatDao")
      private ChatDao chatDao;

    public MyWsHandler() {
        this("wsroom:");
    }
    public MyWsHandler(String prefix) {
        super(prefix);
    }

public void join(NutMap req) {
chatDao.insertNChatroom(req);
        this.join(req.getString("room"));
}

因为handler是new出来的,没有注入一说

把需要的bean注入到endpoint,然后通过handler的构造方法/setter传过去

看createrHandler方法

没明白。。在endpoint注入也是没反应呢

先把注入到endpoint搞定

注入也是dao=null,使用如下方法,自定义的handle里面使用getDao()执行sql,依然是dao=null

@ServerEndpoint(value = "/m/websocket/ws",configurator = NutWsConfigurator.class)
@IocBean
public class MyWebSocket extends MyAbstractWsEndpoint {
    @Inject
    private static Dao dao;
    @Inject
    private static ChatDao chatDao;

    public static void setChatDao(ChatDao chatDao){
        MyWebSocket.chatDao=chatDao;
    }

    public static void setDao(Dao dao){
        MyWebSocket.dao=dao;
    }

    public static Dao getDao(){
        return dao;
    }

    public static ChatDao getChatDao(){
        return chatDao;
    }

}

静态属性是不支持注入的

用实例属性,注入到endpoint,然后在createHandler方法里面,作为构造方法传给handler就行啦

可以了,非常感谢

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