当前位置: 首页 > 知识库问答 >
问题:

带有JavaConfig的Vaadin Spring(不带SpringBoot)

杨征
2023-03-14

我正在尝试将vaadin与spring(没有Spring Boot)和基于java注释的html" target="_blank">spring部分配置结合起来。

自动连接似乎适用于vaadin ui部分,但不适用于“自定义ui类”(例如,“公共类LoginScreen扩展自定义组件”)。我在SysOut上得到一个NPE或一个空对象。

此外,我注意到“@ComponentScan(base Packages={"net.myapp"})”没有扫描bean。声明bean的唯一方法是在CustomConfiguration本身。

XML配置不是我喜欢的东西。

我按照这个教程:链接

自定义配置。JAVA

@Configuration
@ComponentScan(basePackages={"net.myapp"})
@EnableVaadin
public class CustomConfiguration {

// this is working but i want to use componentscan!
@Bean
public String test() {
    return "test...";
}

@Bean
public TestBean testBean() {
    return new TestBean();
}

@Bean
public LoginScreen loginScreenBean() {
    return new LoginScreen();
}

}

SpringVaadinServlet.java

@WebServlet(value = "/*", asyncSupported = true)
@VaadinServletConfiguration(productionMode = false, ui = Application.class)
@SuppressWarnings("serial")
public class SpringVaadinServlet extends VaadinServlet implements SessionInitListener {

@Autowired
protected VaadinUIProvider applicationProvider;

@Override
public void init(ServletConfig config) throws ServletException {
    super.init(config);
    AutowireCapableBeanFactory ctx = ((ApplicationContext) 
            getServletContext().getAttribute("applicationContext")).getAutowireCapableBeanFactory();
    ctx.autowireBean(this);
}

@Override
protected void servletInitialized() {
    getService().addSessionInitListener(this);
}

@Override
public void sessionInit(SessionInitEvent event) throws ServiceException {
    event.getSession().addUIProvider(applicationProvider);      
}

}

瓦迪尼。JAVA

@SpringComponent
@SuppressWarnings("serial")
public class VaadinUIProvider extends UIProvider {

    @Autowired
    ApplicationContext applicationContext;

    @Override
    public Class<? extends UI> getUIClass(UIClassSelectionEvent event) {
        return Application.class;
    }

    @Override
    public UI createInstance(UICreateEvent event) {
        UI instance = new Application();
        System.out.println("applicationContext is null? " + applicationContext);
        applicationContext.getAutowireCapableBeanFactory().autowireBean(instance);
        return instance;
    }

}

SpringApplicationContextListener。JAVA

@WebListener
public class SpringApplicationContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(CustomConfiguration.class);
        sce.getServletContext().setAttribute("applicationContext", applicationContext);     
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    }

}

应用JAVA

@Theme("mytheme1")
@SpringUI
@SuppressWarnings("serial")
public class Application extends UI {

    @Autowired
    private TestBean testBean;

    @Autowired
    private String test;

    @Override
    protected void init(VaadinRequest vaadinRequest) {

        // working
        System.out.println("init testBean: " + testBean);
        System.out.println("init test: " + test);

        Window window = new Window();
        window.setContent(new LoginScreen());
        window.setClosable(false);
        window.setWidth("400px");
        window.setHeight("280px");
        window.setModal(true);
        window.setDraggable(false);
        window.setResizable(false);
        window.center();
        addWindow(window);
        setSizeFull();
    }

}

和下面的“自定义用户界面类”登录creen.java

@UIScope
@SuppressWarnings("serial")
public class LoginScreen extends CustomComponent {

    public static final String VIEW_NAME = "";

    final FormLayout layout = new FormLayout();

    TextField userName = new TextField();
    TextField passWord = new TextField();
    Button submit = new Button("Submit");

    @Autowired
    private TestBean testBean;

    @Autowired
    private String test;

    public LoginScreen() {
        userName.setCaption("Benutzername:");
        passWord.setCaption("Passwort:");

// not working (null)
        System.out.println("loginscreen test: " + testBean);
        System.out.println("loginscreen test: " + test);

        setSizeFull();
    }
}

我很感激你的帮助...

共有1个答案

袁志专
2023-03-14

setContent(新登录屏幕());

如果您希望注入带有注释的字段,Spring应该创建LoginScreen

只需在您的Application类中注入LoginScreen实例

 类似资料:
  • 问题内容: 两者之间到底有什么区别 和 第一个只是加快字段初始化速度的捷径吗?有性能方面的考虑吗? 问题答案: 第二种形式总是创建一个空的地图。 第一种形式是地图文字的特殊情况。地图文字允许创建 非空 地图: 现在,您的(通用)示例: 是没有初始值(键/值对)的地图文字。它完全等同于: 此外,这是为地图指定初始容量(大于初始分配的元素数量)的唯一方法。例: 将创建一个地图,该地图具有足够的空间来容

  • 问题内容: 查看量角器文档,我发现有一个选项可以不使用Selenium服务器使用flag 来运行量角器。 使用硒服务器和不使用硒服务器运行量角器测试之间的区别是什么,除了后者仅支持Chrome,Firefox? 问题答案: 首先,目前,您有 5种不同的内置选项/方式来连接浏览器驱动程序 : 指定在本地启动Selenium独立服务器 指定连接到正在运行的硒服务器(本地或远程) 设置并连接到Sauce

  • 我是Spring的新手,正在注册一个用户。我确实喜欢这个。 这很好,但这里的问题是,在我的欢迎中,我不需要这个用户对象。jsp页面,那么为什么要使模型对象更重呢。因此,我尝试了不使用ModelAttribute,这也适用于我,如下所示。 所以我只想知道什么是专业 我想将我的查询分类为以下4种类型的request.what如果我不需要在视图中发送数据并且我的请求是任何- 查询字符串即GET中的表单数

  • 问题内容: 我注意到,如果使用许多不带括号的DataFrame函数,其行为似乎类似于“属性”,例如 这是如何完成的,是一种好的做法?这是Linux上的熊猫0.15.1 问题答案: 它们是不同的,因此不建议使用,它们清楚地表明这是一种方法并且恰好输出结果,而另一种则表明了预期的输出。 这就是为什么您不应该这样做的原因: 所以好吧,您没有使用括号正确地调用该方法并看到显示为有效的输出,但是如果您引用了

  • 现在我的问题是,如何在自定义的而不是自定义的中重写方法?我没有在这里公布我的代码,因为它与链接的代码本质上是相同的,只是我需要为子创建一个自定义的来代替,这样它就可以按照“pptang”的答案所述进行正确的度量。 否则,有没有比在第二个RecyclerView中使用1个RecyclerView更好的方法?只能有1个RecyclerView使用上述列表和每个中唯一项的网格填充活动/片段吗?

  • 代码: 上下文:尝试在JavaScript中使用 编辑: 完整代码: 编辑: 无法获取