Java spring与vaadin积分
我试图用几个Java spring与vaadin积分,java,spring,servlets,vaadin,Java,Spring,Servlets,Vaadin,我试图用几个uis-vaadin、jsp等实现一个应用程序 它使用的是简单的jsp,但后来我决定使用vaadin作为ui 我已经创建了vaadinservlet(剩下的还有springservlet)。 我的web.xml如下所示 <?xml version="1.0"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
ui
s-vaadin、jsp等实现一个应用程序
它使用的是简单的jsp
,但后来我决定使用vaadin作为ui
我已经创建了vaadinservlet(剩下的还有springservlet)。
我的web.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>
ProjectService
也是一个springbean
@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);
}
}
当我使用springcontroller
(使用JSP)编写应用程序时,它运行良好。
但当我添加vaadin-JSP
时,vaadin应用程序停止工作,并为ProjectService
抛出NullPointerException
,ProjectRepository
。。。我用的所有豆子
有什么问题吗?
我所有的上下文xml
上下文文件都很简单
<import resource="classpath:com/xxxx/app/pmc/pmc-service-context.xml"/>
<context:component-scan base-package="com.xxx.app.pmc"/>
JSP工作得很好,所以我认为问题不在于spring声明本身,而在于spring与我的vaadin的集成
如何解决它?
例如,当我手动创建ProjectTable
对象时,它为ProjectService
抛出NullPointerException
。当我手动创建ProjectService
时,它会为ProjectRepository
抛出NullPointerException
,以此类推。自动布线似乎根本不起作用
还有,忘了添加我的用户界面代码
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);
}
}
正如您所怀疑的,您的Springbean是在应用程序和Spring的servlet上下文中创建的。您的Vaadin servlet无法访问其中任何一个 对于包含代码的详细(手动)解决方案,请检查或搜索适合您的解决方案(我个人建议SpringVaadin集成)
典型的想法是以编程方式将vaadinservlet传递给Spring的一个实用程序类(例如:webapplicationcontexttils)并检索应用程序上下文(由ContextLoaderListener加载)。如果您需要servlet上下文,那么从我看到的代码示例来看,您可以执行与上面相同的操作,但是还可以手动读取上下文(例如:使用XmlWebApplicationContext)并将应用程序上下文设置为其父上下文。非常简单的选择是使用可配置支持。它将实现一些方面的魔力,所有由
@Configurable
注释的java对象将自动集成到Spring中。您可以在中找到更多详细信息。另外请注意,要在GUI中表示上下文信息,您必须使用会话bean。这导致了会话大小的问题,并且在更大的应用程序中,不可能进行集群
<import resource="classpath:com/xxxx/app/pmc/pmc-service-context.xml"/>
<context:component-scan base-package="com.xxx.app.pmc"/>
<mvc:annotation-driven/>
<context:annotation-config/>
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);
}
}