Socket长连接参数解析报错 java.lang.NumberFormatException: null

news/2024/11/15 8:16:30/

问题

Socket长连接参数解析报错 java.lang.NumberFormatException: null

详细问题

笔者使用技术框架Servlet + JSP,基于Socket长连接实现实时聊天室
JSP核心代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %><html>
<head><title>实时聊天室</title><script><c:set var="ChatObjectId" value="${ChatObjectId}"/>var socket;function connect() {socket = new WebSocket("ws://localhost:8080/bms/chat?ChatObjectId=" + ${ChatObjectId});socket.onopen = function () {console.log("WebSocket连接已打开");};socket.onmessage = function (event) {var message = event.data;// 处理接收到的消息,例如将其显示在聊天窗口中var chatWindow = document.getElementById("chat-window");var newMessage = document.createElement("p");newMessage.textContent = message;chatWindow.appendChild(newMessage);};}function sendMessage() {var input = document.getElementById("message");var message = input.value;socket.send(message);input.value = "";}function disconnect() {socket.close();}</script>
</head>
<body><div id="chat-window"></div><input type="text" id="message" /><button onclick="sendMessage()">发送</button><button onclick="connect()">连接</button><button onclick="disconnect()">断开连接</button>
</body>
</html>

java核心代码

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;@ServerEndpoint("/chat")
public class ChatServer {private static Set<Session> sessions = Collections.synchronizedSet(new HashSet<>());private static Map<Integer, Session> userSessions = Collections.synchronizedMap(new HashMap<>());@OnOpenpublic void onOpen(Session session, @PathParam("ChatObjectId") String ChatObjectId) {sessions.add(session);// 将字符串转换为整数类型的用户IDInteger ChatObjectId= Integer.parseInt(ChatObjectId); // 将会话与userId关联,并添加到userSessions集合中userSessions.put(ChatObjectId, session);}@OnMessagepublic void onMessage(String message, Session session) throws IOException {try {Jsonb jsonb = JsonbBuilder.create();MessagePayload payload = jsonb.fromJson(message, MessagePayload.class);Integer targetUserId = payload.getUserId();String content = payload.getContent();sendToUser(targetUserId, content);} catch (JsonbException e) {e.printStackTrace();}}public void sendToUser(Integer userId, String message) throws IOException {Session session = userSessions.get(userId);if (session != null) {session.getBasicRemote().sendText(message);}}@OnClosepublic void onClose(Session session) {sessions.remove(session);}@OnErrorpublic void onError(Throwable error) {error.printStackTrace();}
}

运行项目,控制台报错

java.lang.NumberFormatException: nullat java.lang.Integer.parseInt(Integer.java:542)at java.lang.Integer.parseInt(Integer.java:615)at com.iflytek.bms.web.listener.ChatServer.onOpen(ChatServer.java:23)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen(PojoEndpointBase.java:69)at org.apache.tomcat.websocket.pojo.PojoEndpointServer.onOpen(PojoEndpointServer.java:48)at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:136)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:936)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:748)

解决方案

在JSP页面修改

socket = new WebSocket("ws://localhost:8080/bms/chat?ChatObjectId=" + ${ChatObjectId});

socket = new WebSocket("ws://localhost:8080/bms/chat/ChatObjectId=" + ${ChatObjectId});

原因

@PathParam注解通常用于解析路径参数(修改后的/),而不是查询参数(使用?和&拼接的参数),因此后端接口无法正常获取ChatObjectId的内容,由于默认值为Null,导致报次错误。

疑问

似乎一切都可以解释的通,但是笔者事后复现错误,发现不进行修改也可以正常连接(笔者尝试清楚IDEA缓存于游览器缓存,确定并非IDEA或游览器缓存所导致的),对于该问题,笔者感到好奇,若是有大佬明白,希望指点

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
在这里插入图片描述


http://www.ppmy.cn/news/192284.html

相关文章

idea使用native-image打包springboot项目

native-image简介 native-image 是一个用于将 Java 程序编译为本地可执行文件的工具。它是 GraalVM 的一部分&#xff0c;GraalVM 是一个高性能的通用虚拟机&#xff0c;支持多种语言。 使用步骤 下载GraalVM 安装 GraalVM&#xff1a;首先&#xff0c;你需要安装 GraalVM。…

Spring - BeanFactory与ApplicationContext介绍

文章目录 Spring Bean一、BeanFactory 快速入门1.1 BeanFactory 开发步骤1.2 DI依赖注入 二、ApplicationContext快速入门2.1 入门2.2 BeanFactory 与 ApplicationContext关系2.3 BeanFactory 继承体系2.4 ApplicationContext 继承体系 Spring Bean 之前也了解过Spring Bean&a…

Mapbox经纬度转屏幕xy,屏幕坐标和经纬度

突然有需求&#xff0c;要根据经纬度获取到点在屏幕上的xy位置&#xff0c;百度了一下发现没有mapbox相关的信息&#xff08;都习惯了&#xff0c;mapbox相关的博客百度上都没多少&#xff09; 然后查看官方文档发现有相关的api project()和unproject() 可以进行相互转换&am…

经纬度转换米

var EARTH_RADIUS 6378137.0; //单位Mfunction getRad(d) {return d * Math.PI / 180.0;}/*参数&#xff1a;两地的经纬度数值*/function getFlatternDistance(lat1, lng1, lat2, lng2) {var radLat1 getRad(lat1);var radLat2 getRad(lat2);var a radLat1 - radLat2;va…

经纬度坐标小数位与精度的对应关系

小数点后位数精度(约等于)第1位10000米第2位1000米第3位100米第4位10米第5位1米第6位0.1米第7位0.01米第8位0.001米

GBS国标经纬度转高德经纬度

//原始经纬度点数据&#xff08;GPS&#xff09; let arr [{"lng":"116.555125","lat":"39.85021"},{"lng":"116.555478","lat":"39.851963"}];//转换方法 for(let i0;i<arr.length; i){…

米转换经纬度

在项目中&#xff0c;可能会有这样的需求&#xff0c;查找附近1公里的商店&#xff0c;或者咖啡馆&#xff0c;或者酒店等。而标识位置信息的是经度和纬度。 那手机定位可以得知自己的经度和纬度&#xff0c;那如何计算出附近1公里的精度和纬度范围呢。 计算方法如下&#xf…

各省精确经纬度,省会城市经纬度

chinaData: [{ name: "北京", value: [116.405289, 39.904987] },{ name: "天津", value: [117.190186, 39.125595] },{ name: "河北", value: [114.502464, 38.045475] },{ name: "黑龙江", value: [126.642464, 45.756966] },{ name…