当我在服务器上调用控制器时,我试图通知一个简单的html页面。我有一个调用我的控制器的android应用程序,完成此操作后,我想通知我的网页该控制器已被调用。

这是我的一些代码:

    @RequestMapping("/user")
public class UserController {

    /**
     * Returns user by id.
     *
     * @param user IMEI
     * @return
     */
    @RequestMapping(value = "/{imei}", method = RequestMethod.GET)
    public User getUser(@PathVariable String imei) {

        User myUser = null;
        try {
            myUser = DbConnector.getUserWithImei(imei);
        } catch (Exception e) {
            System.out.println("Couldn't get user from database");
            e.printStackTrace();
        }
        SseEmitter emitter = new SseEmitter();
        try {
            emitter.send("Hallokes");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        emitter.complete();
        return myUser;
    }
}

我看到的所有教程,控制器都返回SseEmitter,但我必须返回一个User。我是否必须使另一个控制器具有另一个映射并侦听该URL?如何在现有控制器中调用该控制器方法?
我的EventSource必须侦听哪个URL?

在此先感谢您的帮助!

亲切的问候。

最佳答案

我想你快要到了,Allinone51。

您对SseEmitter.send()的调用可能应该在getUser方法中。
通常的模式是,当您创建SseEmitter时,需要将其“存储”在其他代码中才能使用它。您从getSseEmitter方法正确返回了SseEmitter,只是忘了存储它,而另一个方法可以在其上调用“发送”。

调整上面的示例,可能是这样的:

//...
private SseEmitter emitter;

@RequestMapping(value = "/{imei}", method = RequestMethod.GET)
public User getUser(@PathVariable String imei) {
    User myUser = null;

    // .. do resolving of myUser (e.g. database etc).

    // Send message to "connected" web page:
    if (emitter != null) {
        emitter.send(myUser.toString()); // Or format otherwise, e.g. JSON.
    }

    // This return value goes back as a response to your android device
    // i.e. the caller of the getUser rest service.
    return myUser;
}

@RequestMapping(value = "/sse")
public SseEmitter getSseEmitter() {
    emitter = new SseEmitter();
    return emitter;
}

当然,以上代码仅适用于一个连接/发射器。有更多的智能方式来存储该发射器。例如,在我的在线游戏应用程序中,我将发射器挂接到每个Player对象中。这样,只要服务器上的播放器对象需要告知播放器设备,它就可以访问其内部的正确发射器。

08-07 19:55