当我们在服务端使用WebSocket的sendObject方法直接向前端传递一个对象时,会有如下报错
javax.websocket.EncodeException: No encoder specified for object of class [这里是你sendObject里传的对象的全名]
原因是你没有在@ServerEndpoint里指定Websocket的编码器。解决方法如下:
编写一个编码器类,下面是一个比较通用的编码器,你可以直接复制粘贴然后进行简单的修改就好,注解也很详细。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.json.JsonMapper;
import javax.websocket.EncodeException;
import javax.websocket.Encoder;
import javax.websocket.EndpointConfig;
/*
* Text<ResponseMessage>里的ResponseMessage是我自己写的一个消息类
* 如果你写了一个名叫Student的类,需要通过sendObject()方法发送,那么这里就是Text<Student>
*/
public class ServerEncoder implements Encoder.Text<ResponseMessage> {
@Override
public void destroy() {
// TODO Auto-generated method stub
// 这里不重要
}
@Override
public void init(EndpointConfig arg0) {
// TODO Auto-generated method stub
// 这里也不重要
}
/*
* encode()方法里的参数和Text<T>里的T一致,如果你是Student,这里就是encode(Student student)
*/
@Override
public String encode(ResponseMessage responseMessage) throws EncodeException {
try {
/*
* 这里是重点,只需要返回Object序列化后的json字符串就行
* 你也可以使用gosn,fastJson来序列化。
*/
JsonMapper jsonMapper = new JsonMapper();
return jsonMapper.writeValueAsString(responseMessage);
} catch ( JsonProcessingException e) {
e.printStackTrace();
return null;
}
}
}
然后在@ServerEndpoint注解的类中指定encoders
/*
*这里的ServerEncoder就是上面的编码器类
*/
@ServerEndpoint(value = "/chat/{room}",encoders = { ServerEncoder.class })
@Component
public class WebSocketService {
// 你的代码
}
? 如果你要传递多种类型的对象,也可以编写多个编码器,然后在endocer里添加多个。
如果你有兴趣,可以来我的博客逛逛
https://timegoesby.top/
本文章参考自下面这篇文章
https://blog.csdn.net/u014175572/article/details/46490395
|