Spring mvc 带JPA NullPointerException的springboot websocket

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

我正在使用SpringBoot web服务,使用websocket向客户端发送消息,并使用JPA保存数据。 在项目中,我使用线程创建数据,然后使用JPA保存数据,使用Websocket显示数据。但它不适用于NullPointExecution。 这是我的代码:

@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)