gpt4 book ai didi

java - Vaadin 和 Spring 与 Touchkit。基于 servlet 和注释?

转载 作者:行者123 更新时间:2023-12-01 10:21:29 25 4
gpt4 key购买 nike

我有一个基于 Spring Boot 的完全运行的 Spring 和 vaadin 应用程序。应用程序类现已修改为创建自定义 servlet,因此我可以在项目中使用 touchkit 和 spring。

我一直在关注这个 git 项目来执行此操作:git project example

public class SmartenderApplication {

public static void main(String[] args) {
SpringApplication.run(SmartenderApplication.class, args);
}

@Bean
public VaadinServlet vaadinServlet() {
return new SpringAwareTouchKitServlet();
}}

我修改了自定义 servlet,以遵循 vaadin 文档,使用 UI 提供程序在 touchkit UI 和浏览器后备 UI 之间进行选择

public class SpringAwareTouchKitServlet extends SpringVaadinServlet {

TouchKitSettings touchKitSettings;
MyUIProvider prov = new MyUIProvider();

@Override
protected void servletInitialized() throws ServletException {
super.servletInitialized();
getService().addSessionInitListener(
new SessionInitListener() {
@Override
public void sessionInit(SessionInitEvent event)
throws ServiceException {
event.getSession().addUIProvider(prov);
}
});

touchKitSettings = new TouchKitSettings(getService());
}
}

class MyUIProvider extends UIProvider {
@Override
public Class<? extends UI>
getUIClass(UIClassSelectionEvent event) {
String ua = event.getRequest()
.getHeader("user-agent").toLowerCase();
if ( ua.toLowerCase().contains("ios")) {
return myTouchkitUI.class;
} else {
return myUI.class;
}
}
}

当我不调用这部分代码来选择 UI 提供程序时,我的应用程序可以正常工作。但它总是会转到 touchkit UI。 :

    getService().addSessionInitListener(
new SessionInitListener() {
@Override
public void sessionInit(SessionInitEvent event)
throws ServiceException {
event.getSession().addUIProvider(prov);
}
});

我的问题是,虽然它会在开始执行所选 UI 代码时选择返回哪个 UI 类,但它会传回最初通过 spring Autowiring 的 null 对象。当我不选择 UI 而只是选择 touchkit 时,这会起作用,我假设它一定位于我的 UI 提供程序选择代码中的某个位置,阻止 Spring 功能允许我的类 Autowiring 等?

最佳答案

嗯,UIProvider 应该管理 UI 实例。此外,由于您使用的是 Spring(无论是否启动),它应该从 Spring 上下文中检索 bean,而不是在需要时自行创建实例:

UIProvider/DefaultUIProvider :

public UI createInstance(UICreateEvent event) {
try {
return event.getUIClass().newInstance();
} catch (InstantiationException e) {
throw new RuntimeException("Could not instantiate UI class", e);
} catch (IllegalAccessException e) {
throw new RuntimeException("Could not access UI class", e);
}
}

因此,我想说的是,而不是扩展简单的 UIProvider (或者更确切地说 DefaultUIProvider )您应该扩展 SpringUIProvider ,它从应用程序的 Spring 上下文中检索实例,因此自动魔法将再次开始发生。

SpringUIProvider :

@Override
public UI createInstance(UICreateEvent event) {
final Class<UIID> key = UIID.class;
final UIID identifier = new UIID(event);
CurrentInstance.set(key, identifier);
try {
logger.debug(
"Creating a new UI bean of class [{}] with identifier [{}]",
event.getUIClass().getCanonicalName(), identifier);
return webApplicationContext.getBean(event.getUIClass());
} finally {
CurrentInstance.set(key, null);
}
}

关于java - Vaadin 和 Spring 与 Touchkit。基于 servlet 和注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35576659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com