当我调用服务器上的 Controller 时,我试图通知一个简单的 html 页面。我有一个调用我的 Controller 的 android 应用程序,完成后我想通知我的网页调用了 Controller 。
这是我的一些代码:
@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;
}
}
我看到的所有教程, Controller 返回 SseEmitter 但我必须返回一个用户。我必须用另一个映射制作另一个 Controller 并监听那个 url 吗?我将如何在现有 Controller 中调用该 Controller 方法? 我的 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;
}
当然,上面的代码仅适用于一个连接/发射器。有更智能的方法来存储该发射器。例如,在我的在线游戏应用程序中,我将发射器挂接到每个玩家对象中。这样,每当我的服务器上的播放器对象有东西要告诉播放器设备时,它就可以访问其内部的正确发射器。
关于java - 使用 SseEmitter 的 Spring rest 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35504419/