@DestinationVariable未找到转换器

时间:2015-10-26 17:08:58

标签: websocket spring-boot

在我的应用程序中,我使用webSocket,我需要将一个对象从客户端传输到服务器。服务器方法如下所示:

@MessageMapping("/chat/{usersSelected}")
public void disperseMessage(@DestinationVariable("usersSelected") List<UserSelected> usersSelected) {...

客户端对象如下所示:

vm.usersSelected = [];

var userSelected = {};
userSelected.userId = userId;
userSelected.institutionId = institutionId;
vm.usersSelected.push(userSelected);

我得到以下异常:

  

org.springframework.core.convert.ConverterNotFoundException:找不到能够从类型java.lang.String转换为类型@ org.springframework.messaging.handler.annotation.DestinationVariable java.util.List

的转换器

有谁知道我怎么解决这个问题(我使用Spring Boot) - 是否有注释来防止异常? 非常感谢!

[编辑]

服务器方法

vm.stompClient.send("/app/chat/" + vm.institutionIdOfSender + "/" + vm.userIdOfSender + "/" + vm.usersSelected + "/" + confirmation, {}, JSON.stringify({ 'name': vm.name, 'id': vm.userIdOfSender, 'message': message }));

客户 - &gt;服务器方法调用:

@MessageMapping("/chat/{institutionIdOfSender}/{userIdOfSender}/{usersSelected}/{confirmation}")
public void disperseMessage(@DestinationVariable("institutionIdOfSender") String institutionIdOfSender,
        @DestinationVariable("userIdOfSender") String userIdOfSender, @DestinationVariable("usersSelected") String usersSelected,
        @DestinationVariable("confirmation") Boolean confirmation, final ChatMessage message) throws Exception {

[EDIT2] 我已经像这样解决了它,但它不是一个很好的解决方案:

服务器

    @MessageMapping("/chat/{institutionIdOfSender}/{userIdOfSender}/{usersSelected}/{confirmation}/{chatMessageFilter}")
public void disperseMessage(@DestinationVariable("institutionIdOfSender") String institutionIdOfSender,
        @DestinationVariable("userIdOfSender") String userIdOfSender, @DestinationVariable("usersSelected") String usersSelectedString,
        @DestinationVariable("confirmation") Boolean confirmation,
        @DestinationVariable("chatMessageFilter") ChatMessageFilterEnum chatMessageFilter, final ChatMessage message) throws Exception {

    // transfer JSON- string into List- Objects:
    final List<UserSelected> usersSelected = new ObjectMapper().readValue(usersSelectedString,
        new TypeReference<List<UserSelected>>() {});

在客户端:

vm.stompClient.send("/app/chat/" + vm.institutionIdOfSender + "/" + vm.userIdOfSender + "/" + JSON.stringify(vm.usersSelected) + "/" + confirmation + "/SELECTED_USERS", {}, JSON.stringify({ 'name': vm.name, 'id': vm.userIdOfSender, 'message': message }));

我是否有机会不在自己的服务器上转换JSON字符串? (这应该是behinde th scene) 谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

@DestinationVariable不引用消息正文,而是路径中String的占位符。

例如(使用与代码相同的模式)

@MessageMapping("/chat/{chatChannel}")
public void disperseMessage(@DestinationVariable("chatChannel") String chatChannel) {...

如果我要向/ chat / allChat发送消息,则chatChannel的值将是字符串“allChat”

所以错误意味着它无法将字母“allChat”转换为List,因为“allChat”不足以提供足够的信息(除非你创建了一个转换器,它从一个通道中抓取了一个用户列表,可能不是你想要什么,并可能作为一种服务更有意义)

  

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html

spring.io在WebSockets上有一个很棒的Spring Boot教程,它显示了一个示例服务,它采用了一个只应使用可用的json解析器的消息体。所以我只调整了该教程中的代码以适合您。

的Javascript

var message = {
    'chatMessage': { 'name': vm.name, 'id': vm.userIdOfSender, 'message': message },
    'usersSelected': vm.usersSelected
}
vm.stompClient.send("/app/chat/" + vm.institutionIdOfSender + "/" + vm.userIdOfSender + "/" + confirmation + "/SELECTED_USERS", {}, JSON.stringify(message));

Java - 随意将类ChatMessageAndUsersSelected命名为更好的

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class GreetingController {


    @MessageMapping("/chat/{institutionIdOfSender}/{userIdOfSender}/{usersSelected}/{confirmation}/{chatMessageFilter}")
    public void disperseMessage(@DestinationVariable("institutionIdOfSender") String institutionIdOfSender,
        @DestinationVariable("userIdOfSender") String userIdOfSender,
        @DestinationVariable("confirmation") Boolean confirmation, final ChatMessageAndUsersSelected message) throws Exception {
        //Do stuff here.
    }

}
  

https://spring.io/guides/gs/messaging-stomp-websocket/