NPE SpringLookupInitializer createLookup Spring-Vaadin 19+
NPE SpringLookupInitializer createLookup Spring-Vaadin 19+
在尝试更新到最新版本的 Vaadin(有问题时为 20)时,由于 SpringLookupInitializer 中的 NPE,我的应用程序将无法启动。当我使用 Vaadin 19 时,这是 SpringLookupInitializer 首次开始使用的地方,我第一次开始遇到错误,我必须始终使用 Spring-Vaadin 12.4.0 来启动应用程序。错误似乎来自此更改...
在 12.4.0 中,SpringLookupInitializer 中的代码定义为:
@Override
protected Lookup createLookup(VaadinContext context,
Map<Class<?>, Collection<Class<?>>> services) {
WebApplicationContext appContext = getApplicationContext(context);
return new SpringLookup(appContext,
(spi, impl) -> instantiate(appContext, spi, impl), services);
}
private WebApplicationContext getApplicationContext(VaadinContext context) {
VaadinServletContext servletContext = (VaadinServletContext) context;
WebApplicationContext appContext = WebApplicationContextUtils
.getWebApplicationContext(servletContext.getContext());
if (appContext == null) {
// Spring behavior is always unbelievably surprising: under some
// circumstances {@code appContext} may be null even though the app
// context has been set via ApplicationContextAware: no idea WHY
ApplicationContextWrapper wrapper = context
.getAttribute(ApplicationContextWrapper.class);
appContext = wrapper == null ? null : wrapper.appContext;
}
return appContext;
}
它以这种方式工作,因为它在继续之前进行检查并更正它(基本上是评论所说的)。在最新版本中,getApplicationContext 被删除并且不再执行检查
@Override
protected Lookup createLookup(VaadinContext context,
Map<Class<?>, Collection<Class<?>>> services) {
WebApplicationContext appContext = WebApplicationContextUtils
.getWebApplicationContext(
((VaadinServletContext) context).getContext());
return new SpringLookup(appContext,
(spi, impl) -> instantiate(appContext, spi, impl), services);
}
我没有使用 spring 启动,只是 MVC 并且一切都与旧的 spring-vaadin 版本一起工作。它不再执行此检查或我可以采取其他措施来阻止这种情况发生的原因是什么?
谢谢
感谢您的报告 - 最新版本的 Vaadin Spring 附加组件似乎忽略了这些更改(在 PR #740 中)。我们正在研究这些变化,并确保这些变化得到前向移植,并将很快为 Vaadin 20 发布。
对于类似的情况,当更新Vaadin版本时出现问题,建议直接向相应的仓库(如vaadin/spring or vaadin/flow)开一个新的issue,这样开发团队会第一时间注意到。谢谢
编辑:修复已在 Vaadin Spring add-on version 17.0.1
中发布。您可以指定您的项目明确使用该版本的 vaadin-spring
工件。它将包含在 Vaadin 20.0.2 版本中,该版本最晚将于 6 月 14 日下周一发布。
在尝试更新到最新版本的 Vaadin(有问题时为 20)时,由于 SpringLookupInitializer 中的 NPE,我的应用程序将无法启动。当我使用 Vaadin 19 时,这是 SpringLookupInitializer 首次开始使用的地方,我第一次开始遇到错误,我必须始终使用 Spring-Vaadin 12.4.0 来启动应用程序。错误似乎来自此更改...
在 12.4.0 中,SpringLookupInitializer 中的代码定义为:
@Override
protected Lookup createLookup(VaadinContext context,
Map<Class<?>, Collection<Class<?>>> services) {
WebApplicationContext appContext = getApplicationContext(context);
return new SpringLookup(appContext,
(spi, impl) -> instantiate(appContext, spi, impl), services);
}
private WebApplicationContext getApplicationContext(VaadinContext context) {
VaadinServletContext servletContext = (VaadinServletContext) context;
WebApplicationContext appContext = WebApplicationContextUtils
.getWebApplicationContext(servletContext.getContext());
if (appContext == null) {
// Spring behavior is always unbelievably surprising: under some
// circumstances {@code appContext} may be null even though the app
// context has been set via ApplicationContextAware: no idea WHY
ApplicationContextWrapper wrapper = context
.getAttribute(ApplicationContextWrapper.class);
appContext = wrapper == null ? null : wrapper.appContext;
}
return appContext;
}
它以这种方式工作,因为它在继续之前进行检查并更正它(基本上是评论所说的)。在最新版本中,getApplicationContext 被删除并且不再执行检查
@Override
protected Lookup createLookup(VaadinContext context,
Map<Class<?>, Collection<Class<?>>> services) {
WebApplicationContext appContext = WebApplicationContextUtils
.getWebApplicationContext(
((VaadinServletContext) context).getContext());
return new SpringLookup(appContext,
(spi, impl) -> instantiate(appContext, spi, impl), services);
}
我没有使用 spring 启动,只是 MVC 并且一切都与旧的 spring-vaadin 版本一起工作。它不再执行此检查或我可以采取其他措施来阻止这种情况发生的原因是什么?
谢谢
感谢您的报告 - 最新版本的 Vaadin Spring 附加组件似乎忽略了这些更改(在 PR #740 中)。我们正在研究这些变化,并确保这些变化得到前向移植,并将很快为 Vaadin 20 发布。
对于类似的情况,当更新Vaadin版本时出现问题,建议直接向相应的仓库(如vaadin/spring or vaadin/flow)开一个新的issue,这样开发团队会第一时间注意到。谢谢
编辑:修复已在 Vaadin Spring add-on version 17.0.1
中发布。您可以指定您的项目明确使用该版本的 vaadin-spring
工件。它将包含在 Vaadin 20.0.2 版本中,该版本最晚将于 6 月 14 日下周一发布。