grails - 在 Grails 3.0.9 中向 src/groovy 注入(inject)服务

标签 grails groovy grails-3.0.9

我正在尝试创建一个 EndPoint 文件。所以我创建了一个文件名 ServerEndPointDemo.groovy

package com.akiong

import grails.util.Environment
import grails.util.Holders

import javax.servlet.ServletContext
import javax.servlet.ServletContextEvent
import javax.servlet.ServletContextListener
import javax.servlet.annotation.WebListener
import javax.websocket.EndpointConfig
import javax.websocket.OnClose
import javax.websocket.OnError
import javax.websocket.OnMessage
import javax.websocket.OnOpen
import javax.websocket.Session
import javax.websocket.server.PathParam
import javax.websocket.server.ServerContainer
import javax.websocket.server.ServerEndpoint
import javax.websocket.EncodeException

import javax.servlet.annotation.WebListener
import java.util.concurrent.CopyOnWriteArraySet

@WebListener
@ServerEndpoint(value="/chat/test/{username}")

public class ServerEndPointDemo implements ServletContextListener {
    private static HashMap<String, String> usersMap = new HashMap<String, String>();
    private static final Set<ServerEndPointDemo> connections = new CopyOnWriteArraySet<>();
    private String username
    private Session session

    @OnOpen
    public void  handleOpen(Session session,@PathParam("username") String user){
        System.out.println("-------------------------------------");

        System.out.println(session.getId() + " has opened a connection");
        println "user = "+user

        connections.add(this);
        this.username   = user
        this.session    = session

        addUserToMap(username,session.getId())

        try{
            def ctx = Holders.applicationContext
            chatService = ctx.chatService
        }
        catch (Exception e){
            println "e = "+e
        }

    }

    @OnClose
    public void  handleClose(Session session){  
        System.out.println("Session " +session.getId()+" has ended");  
    }

    @OnMessage
    public String handleMessage(String message,Session session){
        chatService.saveSessionAdminJava(session.getId())    
    }

    @OnError
    public void  handleError(Throwable t){
        println "error ~"
    }  

    private void sendMessageToAll(String message){
        println "session.size() = "+sessions.size()
        for(Session s : sessions){
            try {
                s.getBasicRemote().sendText(message);
                println "sent to session = "+s.getId()
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}
`

我尝试使用此代码从服务调用方法:
try {
    def ctx = Holders.applicationContext
    chatService = ctx.chatService
} catch (Exception e) {
    println "e = " + e
}

这是我的服务:
package com.akiong.services

import com.akiong.maintenance.Chat

class ChatService {

    def serviceMethod() {

    }

    def saveSessionAdminJava(def sessionJava) {
        println "jaln!!!"
        def chatInstance = Chat.findByIsAdmin("1")
        chatInstance.sessionJava = sessionJava
        chatInstance.save(failOnError: true)
    }
}

但是在我尝试运行这段代码之后,我收到了这个错误:
Error : groovy.lang.MissingPropertyException: No such property: chatService for
class: com.akiong.ServerEndPointDemo

任何人都知道如何在 src/groovy 中从服务调用方法到文件?

最佳答案

所以这就是问题所在。您编写的代码对于注入(inject)服务是正确的:

try {
    def ctx = Holders.applicationContext
    chatService = ctx.chatService
} catch (Exception e) {
    println "e = "+e
}

但是 chatService在您的类(class)的任何地方都没有定义。所以即使你的handleOpen调用方法必须有MissingPropertyException被抛出,但既然你已经处理了顶层 Exception类( 永远不应该被鼓励 )你的 handleOpen 中的异常(exception)方法被压制了。

现在,稍后在您的 handleMessage方法,chatService 再次出现同样的问题未定义,因此您会收到您在问题中发布的异常。

所以,你现在知道答案了 :-) 只需定义 chatService在您的 ServerEndPointDemo类(class)。

更新:
public class ServerEndPointDemo implements ServletContextListener {
    private static HashMap<String, String> usersMap = new HashMap<String, String>();
    private static final Set<ServerEndPointDemo> connections = new CopyOnWriteArraySet<>();
    private String username
    private Session session

    def chartService    // Initialize here
    // rest of your code
}

关于grails - 在 Grails 3.0.9 中向 src/groovy 注入(inject)服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33822353/

相关文章:

mongodb - Grails Mongodb静态集合访问

ajax - Grails中的AJAX搜索

grails - 在Grails 3中未创建表

database - 如何使用Grails自动将当前登录的用户保存到域?

grails - 如何使用Grails将数组的值映射到命令对象中?

grails - 如何使用 groovy 调用 Grails 中的服务

grails - Controller @Mixin 仅在重新编译正在运行的应用程序后工作

java - 我可以在没有 EL 的情况下使用 Hibernate Validator 5 吗?

grails - Grails 3.0.9发送邮件和AsynchronousMail

git - Intellij Grails和Git