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

标签 java spring servlets spring-boot vaadin

我有一个基于 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/

相关文章:

java - 愚蠢的java函数+ OpenCV

spring - 如何以编程方式访问 Spring Boot 应用程序的名称?

java - 在运行时创建的外部groovy类中注入(inject)spring服务

java - 在浏览器中显示传入的 JMS 消息

java - 关闭 Spring 应用程序会使数据源的 JNDI 名称脱离 jdbc 上下文

java - 在 Apache Tomcat WebServer 中无法访问该站点

java - Spring集成Kafka

java - Rest API 调用可在极短的时间内从多个 API 提供商获取数据 : Example websites like makemytrip

java - 如何使用 mvn 命令从终端执行@SpringBootTest?

java.lang.ClassNotFoundException : org. apache.commons.fileupload.FileItemFactory