Spring mvc 带JPA NullPointerException的springboot websocket
我正在使用SpringBoot web服务,使用websocket向客户端发送消息,并使用JPA保存数据。 在项目中,我使用线程创建数据,然后使用JPA保存数据,使用Websocket显示数据。但它不适用于NullPointExecution。 这是我的代码:Spring mvc 带JPA NullPointerException的springboot websocket,spring-mvc,spring-boot,nullpointerexception,spring-data-jpa,spring-websocket,Spring Mvc,Spring Boot,Nullpointerexception,Spring Data Jpa,Spring Websocket,我正在使用SpringBoot web服务,使用websocket向客户端发送消息,并使用JPA保存数据。 在项目中,我使用线程创建数据,然后使用JPA保存数据,使用Websocket显示数据。但它不适用于NullPointExecution。 这是我的代码: @RestController @ServerEndpoint("/websocket") public class CrawlingController { private final Logger logger = Logge
@RestController
@ServerEndpoint("/websocket")
public class CrawlingController {
private final Logger logger = LoggerFactory.getLogger(CrawlingController.class);
@Autowired
private SimulateDataRepository simulateDataRepository;
private static GlobalStatus globalStatus = GlobalStatus.getInstance();
private Session session;
private static CopyOnWriteArraySet<CrawlingController> crawlingControllers =
new CopyOnWriteArraySet<>();
@OnOpen
public void onOpen(Session session) throws Exception {
this.session = session;
crawlingControllers.add(this);
String message = dataCrawling();
}
@OnMessage
public void onMessage(String message, Session session) throws IOException {
for (CrawlingController controller : crawlingControllers)
sendMessage(message);
}
@OnClose
public void onClose() {
crawlingControllers.remove(this);
if (crawlingControllers.size() == 0)
end();
session=null;
end();
}
private void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
public void onError(Session session, Throwable error) {
logger.error(error.getMessage());
System.out.println("websocket found something error!");
}
@RequestMapping("/start")
public String dataCrawling() throws Exception {
if (!globalStatus.isDataCrawling) {
Process process = null;
synchronized (globalStatus) {
process = Utils.crawling();
globalStatus.crawlingProcss = process;
globalStatus.isDataCrawling = true;
}
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
new Thread(() -> {
try {
stuffSimulate(bufferedReader);
} catch (IOException | ParseException e) {
logger.error(e.getMessage());
}
}).start();
return "start Finish!";
} else return "faild";
}
public void stuffSimulate(BufferedReader reader) throws IOException, ParseException {
line = reader.readLine();
while (globalStatus.isDataCrawling) {
SimulateData simulateData = new SimulateData();
.... ...
simulateData.setData(data.toString());
this.saveAndShow(simulateData);
}
}
}
}
private void saveAndShow(SimulateData simulateData) throws IOException {
simulateData = simulateDataRepository.saveAndFlush(simulateData);
SummaryData summaryData = SimulateService.obtainSummary(simulateData);
onMessage(summaryData.printSummary(),this.session);
summaryData.sout();
}
}
为什么simulateDataRepository在websocket时不能保存和刷新,但在我使用“/start”时可以保存和刷新?
我应该如何使websocket工作?您将状态保持为单例状态。。。您认为在打开10个会话后,
会话
实例vatiable会发生什么情况。。。。仍然保留的会话
。永远不要把状态保持在一个单独的状态中。我需要保持全局状态来保存状态并防止再次发生某些事情。我知道这是一个糟糕的模式,但我找不到一个更好的模式。这不是一个主要问题,我的困惑是如何消除NullPointerException?谢谢大家!@DeinumNo先生你不。。。你需要找到另一种方法,你无法保持全局状态。你的设计有缺陷,基本上是你问题的根源。那么,我应该怎么做,以防止有人再次做某事,并在需要时向他们发送以其他方法创建的参数?在我看来,他们可能会做一些需要完成另一个操作的事情,也可能会做一些他们不能再做的事情,除非他们撤消以前所做的操作。@M.Deinumj必须在方法中传递会话,或者创建一个包含会话的作用域代理,永远不要将其保存在单例中。我也没有像你所说的那样理解你的sendMessage
方法。您在方法中有一个非常好的会话
,但决定放弃它吗?
Exception in thread "Thread-5" java.lang.NullPointerException
at cn.linhos.controller.CrawlingController.saveAndShow(CrawlingController.java:293)
at cn.linhos.controller.CrawlingController.stuffSimulate(CrawlingController.java:172)
at cn.linhos.controller.CrawlingController.lambda$dataCrawling$0(CrawlingController.java:104)
at java.lang.Thread.run(Thread.java:748)