package spittr; import java.security.Principal; import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.handler.annotation.MessageExceptionHandler; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.simp.annotation.SendToUser; import org.springframework.stereotype.Controller; @Controller public class SpittrMessageController { // private static final Logger logger = LoggerFactory.getLogger(SpittrMessageController.class); private SpittleRepository spittleRepo; private SpittleFeedService feedService; @Autowired public SpittrMessageController(SpittleRepository spittleRepo, SpittleFeedService feedService) { this.spittleRepo = spittleRepo; this.feedService = feedService; } //FIXME 为何接收不到消息 @MessageMapping("/spittle") @SendToUser("/queue/notifications") public Notification handleSpittle(Principal principal, SpittleForm form) { System.out.println("访问spittle"); Spittle spittle = new Spittle(principal.getName(), form.getText(), new Date()); spittleRepo.save(spittle); feedService.broadcastSpittle(spittle); return new Notification("Saved Spittle for user: " + principal.getName()); } // @MessageExceptionHandler // @SendToUser("/queue/errors") // public Exception handleExceptions(Exception e) { // logger.error("Error handling message:" + e.getMessage()); // return e; // } /* * 在使用Spring和STOMP消息功能的时候,我们有三种方式利用认证用户: * * @MessageMapping和@SubscribeMapping标注的方法能够使用Principal来获取认证用户; * * @MessageMapping、@SubscribeMapping和@MessageException方法返回的值能够以消息的形式发送给认证用户; * SimpMessagingTemplate能够发送消息给特定用户 */ }