首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧与金刚一体化

弹簧与金刚一体化
EN

Stack Overflow用户
提问于 2014-11-27 06:59:51
回答 2查看 1.5K关注 0票数 1

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

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

我已经创建了( servlet也离开了)。我的web.xml看起来像这样

代码语言:javascript
复制
<?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>

我已经创建了vaadin table组件,并根据我的需要对它进行了调整。我用自动包扎服务。

代码语言:javascript
复制
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也是一种春豆。

代码语言:javascript
复制
@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);
    }

}

ProjectRepository是另一个春豆。它使用来自MyBatis的MyBatis bean。

代码语言:javascript
复制
@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)编写应用程序时,它运行得很好。但是当我添加了vaadin - JSP停止工作时,vaadin应用程序将NullPointerException抛给ProjectServiceProjectRepository.我用的所有豆子。

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

代码语言:javascript
复制
<import resource="classpath:com/xxxx/app/pmc/pmc-service-context.xml"/>
<context:component-scan base-package="com.xxx.app.pmc"/>

我的pmc-web-context.xml也有这一行。

代码语言:javascript
复制
<mvc:annotation-driven/>
<context:annotation-config/>

它在JSP中运行得很好,所以我认为问题不在于spring声明本身,而在于将spring集成到我的vaadin中。

如何解决这个问题?例如,当我手动创建ProjectTable对象时-它抛出NullPointerException for ProjectService。当我手动创建ProjectService时,它会为ProjectRepository抛出NullPointerException等等。看来自动装配根本不起作用。

P.S忘记添加我的UI代码

代码语言:javascript
复制
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);
    }

}
EN

回答 2

Stack Overflow用户

发布于 2014-11-29 18:28:18

正如您所怀疑的,Spring是在应用程序和Spring的servlet上下文中创建的。您的Vaadin servlet无法访问其中的任何一个。

要获得包含代码的详细(手动)解决方案,请检查瓦丁维基或搜索适合您使用的Vaadin的加法 (我个人建议使用SpringVaadinIntegration)。

典型的想法是以编程方式将Vaadin传递给Spring的一个实用类(例如: WebApplicationContextUtils)并检索应用程序上下文(由ContextLoaderListener加载)。如果您需要servlet上下文,那么根据我看到的代码示例,您可以执行上面的操作,但是还要手动读取上下文(例如:使用XmlWebApplicationContext),并将应用程序上下文设置为它的父上下文。

票数 0
EN

Stack Overflow用户

发布于 2014-11-29 18:35:00

非常简单的选择是使用可配置支持。它将实现一些方面的魔力,所有由@Configurable注释的java对象都将自动集成到Spring中。您可以在春季文献中找到更多细节。还请注意,要在GUI中表示上下文信息,您必须使用会话bean。这就导致了会话大小的问题,而在更大的应用程序中,不可能进行集群。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27164802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档