asyncuncaughtexceptionhandler不支持实体管理器

klr1opcd  于 2021-07-24  发布在  Java
关注(0)|答案(0)|浏览(300)

我有一个简单的asyncuncaughtexceptionhandler impleStation和asyncconfig,它实现了asyncconfigurer。看起来是这样的:

  1. @Configuration
  2. @EnableAsync
  3. @RequiredArgsConstructor
  4. public class AsyncConfig implements AsyncConfigurer {
  5. private final AsyncUncaughtExceptionHandler asyncUncaughtExceptionHandler;
  6. private final ThreadPoolTaskExecutor threadPoolTaskExecutor;
  7. @Override
  8. public Executor getAsyncExecutor() {
  9. return threadPoolTaskExecutor;
  10. }
  11. @Override
  12. public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
  13. return asyncUncaughtExceptionHandler;
  14. }
  15. }
  1. public class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
  2. private final WebSocketSender webSocketSender;
  3. @Override
  4. public void handleUncaughtException(Throwable throwable, Method method, Object... args) {
  5. //logs and other logic
  6. webSocketSender.send(
  7. StompErrorMessage.errorBuilder()
  8. //building error message
  9. .build()
  10. );
  11. }
  12. }

websocketsender的send()获取会话用户并向其发送通知,然后通过dao类保存usernotification。websocketsender是一个spring管理的bean。

  1. @RequiredArgsConstructor
  2. public class WebSocketSender {
  3. private final SimpMessagingTemplate simpMessagingTemplate;
  4. private final CoreSessionService sessionService;
  5. private final BaseDAO baseDAO;
  6. @Transactional
  7. public void send(StompMessage message) {
  8. User user = sessionService.getSessionUser();
  9. simpMessagingTemplate.convertAndSendToUser(user.getLogin(), "/queue/reply", message);
  10. UserNotification userNotification = new UserNotification();
  11. userNotification.setUser(user);
  12. userNotification.setNotification(message);
  13. baseDAO.save(userNotification);
  14. }
  15. }

但它不起作用。出现“无支持的实体管理器”错误。

  1. java.lang.IllegalStateException: No transactional EntityManager available
  2. at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:283)
  3. at com.sun.proxy.$Proxy227.unwrap(Unknown Source)
  4. at com.xx.model.core.dao.impl.JpaDaoImpl.findById(JpaDaoImpl.java:127)
  5. at com.xx.core.util.session.impl.SessionServiceImpl.getUserFromDetails(SessionServiceImpl.java:231)
  6. at com.xx.core.util.session.impl.SessionServiceImpl.getSessionUser(SessionServiceImpl.java:91)
  7. at com.xx.websocket.WebSocketSender.send(WebSocketSender.java:15)
  8. at com.xx.app.handler.AsyncExceptionHandler.handleUncaughtException(AsyncExceptionHandler.java:38)
  9. at org.springframework.aop.interceptor.AsyncExecutionAspectSupport.handleError(AsyncExecutionAspectSupport.java:314)
  10. at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:124)
  11. at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  12. at org.springframework.security.concurrent.DelegatingSecurityContextRunnable.run(DelegatingSecurityContextRunnable.java:84)
  13. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  14. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  15. at java.lang.Thread.run(Thread.java:748)

将@transactional注解放入asyncexceptionhandler或websocketsender没有帮助。websocketsender在其他地方工作正常(不是从asyncexceptionhandler发送的通知)。
启用事务管理。在这个项目中,交易在任何地方都可以正常进行。所以问题可能出在asyncconfig或asyncexceptionhandler本身(我的想法)。你有什么想法吗?
先谢谢你。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题