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

spring和vaadin集成

燕正德
2023-03-14

我正在尝试使用几个uis-vaadin、jsp等实现一个应用程序。

它使用简单的jsp,但后来我决定使用vaadin作为ui。

我创建了vaadin servlet(Spring的servlet也留下了)。我的网络.xml看起来像这样

<?xml version="1.0"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:/pmc-web-context.xml
        </param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>another-pmc-servlet</servlet-name>
        <servlet-class>com.vaadin.server.VaadinServlet</servlet-class>
        <init-param>
            <param-name>UI</param-name>
            <param-value>com.xxxx.app.pmc.vaadin.PmcUi</param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
    </servlet>

    <servlet>
        <servlet-name>pmc-servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>another-pmc-servlet</servlet-name>
        <url-pattern>/VAADIN/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>pmc-servlet</servlet-name>
        <url-pattern>/JSP/*</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>/WEB-INF/jsp/*</url-pattern>
    </servlet-mapping>

</web-app>

我创建了vaadintable组件并根据我的需要对其进行了调整。我使用自动装配进行服务。

package com.xxxx.app.pmc.vaadin.components;

import com.xxxx.app.pmc.model.Project;
import com.xxxx.app.pmc.service.project.ProjectService;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Table;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component("projectTable")
public class ProjectTable extends Table {

    private static final String CAPTION = "Projects";
    private static final String[] headers = { "Project name", "Project owner", "ID" };

    @Autowired
    private ProjectService projectService;

    public Table createTable() {
        this.setContainerDataSource(projectDatasource());
        this.setVisibleColumns(headers);
        this.setSelectable(true);
        this.setImmediate(true);

        return this;
    }

    public IndexedContainer projectDatasource() {
        IndexedContainer indexedContainer = new IndexedContainer();

        for(String header: headers) {
            indexedContainer.addContainerProperty(header, String.class, "");
        }

        List<Project> projects = projectService.findAllProjects();

        for(int i = 0; i < projects.size(); i++) {
            Object id = indexedContainer.addItem();
            Project item = projects.get(i);
            indexedContainer.getContainerProperty(id, headers[0]).setValue(item.getProjectName());
            indexedContainer.getContainerProperty(id, headers[1]).setValue(item.getProjectOwner());
            indexedContainer.getContainerProperty(id, headers[1]).setValue(item.getProjectId());
        }

        return indexedContainer;
    }

}

ProjectService也是一个Spring bean。

@Service("projectService")
public class ProjectService {

    @Autowired
    private ProjectRepository projectRepository;

    public void insertProject(Project project) {
        projectRepository.store(project);
    }

    public List<Project> findAllProjects() {
        return projectRepository.getAllItems();
    }

    public Project getProject(String id) {
        return projectRepository.get(id);
    }

}

< code>ProjectRepository是另一个spring bean。它使用MyBatis中的< code > SqlSessionTemplate bean。

@Repository("projectRepository")
public class ProjectRepository implements IRepository<Project> {

    private static final String STORE_PROJECT = "Project.insertProject";
    private static final String GET_PROJECT_BY_ID = "Project.getProjectById";
    private static final String GET_PROJECT_LIST = "Project.getProjectList";

    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;

    @Override
    public void store(Project object) {
        sqlSessionTemplate.insert(STORE_PROJECT, object);
    }

    @Override
    public Project get(String id) {
        return sqlSessionTemplate.selectOne(GET_PROJECT_BY_ID, id);
    }

    @Override
    public List<Project> getAllItems() {
        return sqlSessionTemplate.selectList(GET_PROJECT_LIST);
    }

} 

当我使用spring controller(使用JSP)编写应用程序时,它工作得很好。但是,当我添加vaadin - JSP时,它停止工作,vaadin应用程序抛出< code>ProjectService、< code>ProjectRepository的< code > NullPointerException ...我用的所有豆子。

什么问题?我所有的上下文xml上下文文件都很简单。

<import resource="classpath:com/xxxx/app/pmc/pmc-service-context.xml"/>
<context:component-scan base-package="com.xxx.app.pmc"/>

我的< code>pmc-web-context.xml也有这几行。

<mvc:annotation-driven/>
<context:annotation-config/>

它与JSP一起工作得很好,所以我认为问题不在于Spring声明本身,而在于Spring与我的vaadin的集成。

如何解决?例如,当我手动创建<code>ProjectTable</code>对象时,它会为<code>ProjectService</code>抛出<code>NullPointerException</code>。当我手动创建ProjectService时,它会为ProjectRepository抛出 ,以此类推。自动连接似乎根本不起作用。

页(page的缩写)忘记添加我的用户界面代码了

package com.xxxx.app.pmc.vaadin;

import com.xxxx.app.pmc.vaadin.components.ProjectTable;
import com.vaadin.annotations.Title;
import com.vaadin.server.VaadinRequest;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

import org.springframework.stereotype.Component;

@Title("PMC")
@Component("pmcVaadin")
public class PmcUi extends UI {

    @Override
    protected void init(VaadinRequest request) {
        VerticalLayout mainLayout = new VerticalLayout();
        ProjectTable projectTable = new ProjectTable();
        mainLayout.addComponent(projectTable.createTable());
        mainLayout.setSizeFull();
        setContent(mainLayout);
    }

}

共有2个答案

苏俊友
2023-03-14

非常简单的选择是使用可配置的支持。它会变一些魔术,所有由< code>@Configurable注释的java对象都会自动集成到Spring中。您可以在Spring文档中找到更多细节。另外请注意,要在贵由表示上下文信息,必须使用会话beans。这导致了会话大小的问题,并且在较大的应用程序中不可能进行集群。

石正卿
2023-03-14

就像您怀疑Springbean是在应用程序和Spring的servlet上下文中创建的一样。您的Vaadin servlet无法访问其中任何一个。

有关带有代码的详细(手动)解决方案,请查看Vaadin的wiki或搜索适当的Vaadin附加组件,这些插件将为您完成工作(我个人推荐SpringVaadin集成)。

典型的想法是以编程方式将Vaadin servlet传递给Spring的实用程序类之一(例如:WebApplication ationContextUtils)并检索应用程序上下文(由ContextLoaderListener加载)。如果您需要servlet上下文,那么从我看到的代码示例中,您可以执行与上述相同的操作,但还需要手动读取上下文(例如:使用XmlWebApplication ationContext)并将应用程序上下文设置为其父级。

 类似资料:
  • 我正在开发受spring security保护的spring boot应用程序。以下是安全配置的一部分: 我将使用VAADIN实现一些管理仪表板来管理我的应用程序。我读到“在Spring或Vaadin中禁用CSRF保护。如果您都打开了,您的应用程序将无法工作。”。 在我的情况下,我需要禁用Vaadin中的CSRF保护,但我找不到如何使用Java配置来做到这一点。 此时此刻,我得到:https://

  • 我试图将与(https://vaadin.com/wiki/-/wiki/main/vaadin+spring)集成。 我的应用程序类只是启动Spring应用程序 https://gist.github.com/anonymous/C047030C61B90C02D1EF pom.xml包含依赖项 当我输入localhost:8080时,它会将我重定向到Spring Security提供的登录ur

  • 我目前正在尝试使用Vaadin.Spring的ViewAccessControl接口,如本教程最后一段所述。 但是在实现isAccessGranted方法时,我会得到以下错误:

  • 我的新Vaadin项目有一个非常奇怪的问题。如果我启动应用程序并与用户登录,然后切换浏览器并再次打开站点,则会话似乎将被共享。我在两个窗口中都有相同的内容。 我读了一些关于这个问题的论坛帖子,他们都说不要在同一个浏览器中打开应用程序。好的,我启动了一个虚拟机,但是,同样的问题。或者,从上下文中删除所有静态变量。我已经这样做了,现在使用ThreadLocal模式。 我完全不知道出了什么问题。我相信S

  • 我在将Vaadin与Spring应用程序集成时遇到一些问题。我的所有bean都在“rootcontext.xml”文件中。我可以通过实例化“rootcontext.xml”然后为我的一个服务类调用bean来调用bean。 我可以这样填充表,但这是调用服务类的正确方法吗?因为我有更多的表必须称之为这个。 这是我的UI类: 我的根上下文。xml文件位于目录/WEB-INF/spring/root上下文

  • 我对UserDetailsServiceImpl()有问题 org.springframework.beans.factory.BeanCreationException:创建名为securityConfig的bean时出错:自动安装的依赖项注入失败;构造函数UserDetailsServiceImpl()未定义 应用程序启动失败((