未注解的方法重写注解为 @NonNullApi 的方法

解决方法

这个错误是因为 Spring 框架在方法上使用了 @NonNullApi 注解,要求重写的方法参数也需要有相应的空值注解。在你的代码中,getPayload() 方法需要添加 @NonNull 注解。
以下是几种解决方案:
方案 1:为匿名内部类的方法添加注解(推荐)
@Component
@Slf4j
public class SessionWebSocketHandler extends TextWebSocketHandler {
@Override
public void afterConnectionEstablished(@NonNull WebSocketSession session) throws IOException {
session.sendMessage(new WebSocketMessage<>() {
@Override
@NonNull
public Object getPayload() {
return "WebSocket 连接成功";
}
@Override
public int getPayloadLength() {
return "WebSocket 连接成功".getBytes().length;
}
@Override
public boolean isLast() {
return true;
}
});
}
}
方案 2:使用 Spring 提供的 TextMessage 类(更简洁)
package com.weiyu.handler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.lang.NonNull;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.io.IOException;
@Component
@Slf4j
public class SessionWebSocketHandler extends TextWebSocketHandler {
@Override
public void afterConnectionEstablished(@NonNull WebSocketSession session) throws IOException {
// 使用 TextMessage 替代匿名内部类
session.sendMessage(new TextMessage("WebSocket 连接成功"));
}
}
方案 3:添加完整的参数注解
如果你坚持使用匿名内部类,确保所有重写的方法都有正确的注解:
@Override
public void afterConnectionEstablished(@NonNull WebSocketSession session) throws IOException {
session.sendMessage(new WebSocketMessage<>() {
@Override
@NonNull
public Object getPayload() {
return "WebSocket 连接成功";
}
@Override
public int getPayloadLength() {
return "WebSocket 连接成功".getBytes().length;
}
@Override
public boolean isLast() {
return true;
}
});
}
推荐使用方案 2 的原因:
- 代码更简洁:使用
TextMessage避免了复杂的匿名内部类 - 符合 Spring 设计:
TextMessage是 Spring 专门为文本消息提供的实现 - 避免注解问题:不需要处理复杂的注解配置
- 更好的性能:
TextMessage已经优化过,性能更好
使用方案 2 后,你的代码会更加简洁且符合 Spring 的最佳实践。
