java - VaadinSession 在销毁期间不拥有锁导致 AssertionError

标签 java spring tomcat vaadin

我们在嵌入式 Tomcat 中运行 Vaadin(版本 8.5.1,vaadin-spring 版本 3.1)和 Spring(版本 5.1.1)。当我关闭 Tomcat 服务器时,我遇到了带有以下堆栈跟踪的 AssertionError:

Caused by: java.lang.AssertionError
at com.vaadin.server.VaadinSession.setAttribute(VaadinSession.java:1108) ~[vaadin-server-8.5.1.jar:8.5.1]
at com.vaadin.spring.internal.UIScopeImpl$UIStore.destroy(UIScopeImpl.java:246) ~[vaadin-spring-3.1.0.jar:3.1.0]
at com.vaadin.spring.internal.UIScopeImpl$UIStore.serviceDestroy(UIScopeImpl.java:260) ~[vaadin-spring-3.1.0.jar:3.1.0]
at com.vaadin.server.VaadinService.lambda$destroy$4(VaadinService.java:2115) ~[vaadin-server-8.5.1.jar:8.5.1]
at java.util.concurrent.ConcurrentHashMap$KeySetView.forEach(ConcurrentHashMap.java:4649) ~[?:1.8.0_191]
at java.util.Collections$SetFromMap.forEach(Collections.java:5476) ~[?:1.8.0_191]
at com.vaadin.server.VaadinService.destroy(VaadinService.java:2115) ~[vaadin-server-8.5.1.jar:8.5.1]
at com.vaadin.server.VaadinServlet.destroy(VaadinServlet.java:1440) ~[vaadin-server-8.5.1.jar:8.5.1]
at org.apache.catalina.core.StandardWrapper.unload(StandardWrapper.java:1281) ~[tomcat-embed-core-9.0.12.jar:9.0.12]

Tomcat 似乎调用了 VaadinServlet 的 destory() 方法,而 VaadinServlet 又调用了 VaadinService.destroy()。因为这将调用 VaadinSession.setAttribute,所以它需要一个它不拥有的锁。使用调试器,我确认此时锁不属于任何人。

我做错了什么?我在网上搜索过,但似乎没有人遇到同样的问题。感谢您的帮助。

最佳答案

我认为这是 vaadin-spring 中的错误。我创建了 https://github.com/vaadin/spring/issues/383用于跟踪此案例。

关于java - VaadinSession 在销毁期间不拥有锁导致 AssertionError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53374996/

相关文章:

eclipse - 创建一个新的 Tomcat 项目

java - 在 tomcat Web 服务中生成后台线程

java - JAVA通过并发在静态方法中实现唯一ID号

java - 是否可以在 Weblogic 10.3 中运行 OSGi 组件?

java - RestEasy 客户端无法使用 @PathParam 参数

java - Hibernate 获取带有条件的相关表

spring - 从另一个gradle任务运行gradle测试

mysql - Grails 2.4 Mysql 验证查询不适用于 VPS

java - 如果 exe 路径包含非英文字符,则使用 Runtime.getRuntime().exec 方法调用 exe 时出错

java - 用于 Spring Boot 的 GraphQL Java 客户端