在我的应用程序中,我使用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) 谢谢你的帮助!
答案 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.
}
}