Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确地将Vaadin与Spring框架集成?_Java_Spring_Vaadin - Fatal编程技术网

Java 如何正确地将Vaadin与Spring框架集成?

Java 如何正确地将Vaadin与Spring框架集成?,java,spring,vaadin,Java,Spring,Vaadin,我在将Vaadin与Spring应用程序集成时遇到一些问题。我的所有bean都在rootcontext.xml文件中。我可以通过实例化rootcontext.xml,然后为我的一个服务类调用bean来调用bean 我可以这样填充表,但这是调用服务类的正确方法吗?因为我有更多的表必须称之为这个 public final class TestTable extends Table { private ApplicationContext applicationContext = (Applicat

我在将Vaadin与Spring应用程序集成时遇到一些问题。我的所有bean都在rootcontext.xml文件中。我可以通过实例化rootcontext.xml,然后为我的一个服务类调用bean来调用bean

我可以这样填充表,但这是调用服务类的正确方法吗?因为我有更多的表必须称之为这个

public final class TestTable extends Table {

private ApplicationContext applicationContext = (ApplicationContext) VaadinServlet.getCurrent().getServletContext()
        .getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

private Service service = this.applicationContext.getBean("service",
        Service.class);

public TestTable() {
    service.findAll()
}
这是我的UI类:

@SpringUI
@Theme("dashboard")
@Widgetset("vaadin.DashboardWidgetSet")
public class TestUI extends UI {

/**
 * 
 */
private static final long serialVersionUID = -620721219079395670L;

private final DashboardEventBus dashboardEventbus = new DashboardEventBus();

@Override
protected void init(VaadinRequest request) {

    setLocale(Locale.US);

    DashboardEventBus.register(this);
    Responsive.makeResponsive(this);
    addStyleName(ValoTheme.UI_WITH_MENU);

    updateContent();

    // Some views need to be aware of browser resize events so a
    // BrowserResizeEvent gets fired to the event bus on every occasion.
    Page.getCurrent().addBrowserWindowResizeListener(new BrowserWindowResizeListener() {
        @Override
        public void browserWindowResized(final BrowserWindowResizeEvent event) {
            DashboardEventBus.post(new BrowserResizeEvent());
        }
    });
}

private void updateContent() {
    setContent(new MainView());
}

@WebServlet(urlPatterns = { "/TestUI/*", "/VAADIN/*" }, name = "TestUIServlet", asyncSupported = true)
@VaadinServletConfiguration(ui = TestUI.class, productionMode = false)
public static class TestUIServlet extends VaadinServlet {

}
}
我的root-context.xml文件位于目录/WEB-INF/spring/root-context.xml中

Vaadin servlet的applicationContext.xml位于目录/WEB-INF/spring/Vaadin/applicationContext.xml中

这是我的web.xml。Vaadin Spring教程说使用上下文加载器初始化“applicationContext.xml”。我可以将其路径添加到contextConfigLocation参数,但应该只有一个根上下文

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">

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

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
</web-app>

我意识到的一个问题是,我对Vaadin Spring使用了错误的版本。我使用的是Vaadin Spring 2.0,但它不适用于Vaadin 7。所以我把它改成了1.2

    <dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin-spring</artifactId>
        <version>1.2.0</version>
    </dependency>
@启用Spring视图的导航需要EnableVaadinNavigation

@SpringUI
@Theme("dashboard")
public class UI extends UI {

@Autowired
private SpringViewProvider viewProvider;

private final HorizontalLayout root = new HorizontalLayout();
private ComponentContainer content;
private Navigator navigator;

@Override
protected void init(VaadinRequest request) {

    setLocale(Locale.US);

    Responsive.makeResponsive(this);
    addStyleName(ValoTheme.UI_WITH_MENU);

    root.setSizeFull();
    root.addStyleName("mainview");
    setContent(root);

    root.addComponent(new DashboardMenu());

    content = new CssLayout();
    content.addStyleName("view-content");
    content.setSizeFull();
    root.addComponent(content);
    root.setExpandRatio(content, 1.0f);

    navigator = new Navigator(this, content);
    navigator.addProvider(viewProvider);
    navigator.navigateTo(DashboardView.NAME);
}
}
我在UI中自动连接了SpringViewProvider,这也是识别用SpringView注释的类所必需的

可在此处找到所有配置:


你有没有机会检查一下新的还是旧的?为了保持干净,表应该只显示数据,其他人应该调用服务并向表提供填充信息ApplicationContext.xml是用于xml定义的spring上下文的通用名称,但是您可以随意命名它,因此,如果您已经拥有rootcontext.xml,则不需要创建另一个。您可以尝试的一件事是迁移到基于注释的上下文。这并不是必须的,这是个人的偏好,但我发现在编写代码时查看信息比查看XML定义更有帮助,即使现在IDE对这些东西有很好的spring支持。根据您的评论,我假设您正在实例化两个不同的spring上下文。通常有一个这样的上下文包含所有bean定义,因此它可以在需要时正确地注入它们,除非您需要。有两个不同的上下文,其中一个不知道另一个中有什么。您可以做的是。保持原样,在web.xml中引用根上下文,然后按照中所述在根上下文中导入applicationContext。如果我是你,我会完全迁移到一个基于注释的上下文,因为你已经有了一些这样的bean和配置,不再担心XMLs。Spring boot与否取决于您,并且应该提供有关如何引导和使用Spring boot的足够信息。您也可以从基于Spring boot的简单示例中获得一些灵感。
<servlet>
    <servlet-name>UIServlet</servlet-name>
    <servlet-class>com.vaadin.spring.server.SpringVaadinServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>UIServlet</servlet-name>
    <url-pattern>/UI/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>UIServlet</servlet-name>
    <url-pattern>/VAADIN/*</url-pattern>
</servlet-mapping>
@Configuration
@EnableVaadin
@EnableVaadinNavigation
public class VaadinConfiguration {

}
@SpringUI
@Theme("dashboard")
public class UI extends UI {

@Autowired
private SpringViewProvider viewProvider;

private final HorizontalLayout root = new HorizontalLayout();
private ComponentContainer content;
private Navigator navigator;

@Override
protected void init(VaadinRequest request) {

    setLocale(Locale.US);

    Responsive.makeResponsive(this);
    addStyleName(ValoTheme.UI_WITH_MENU);

    root.setSizeFull();
    root.addStyleName("mainview");
    setContent(root);

    root.addComponent(new DashboardMenu());

    content = new CssLayout();
    content.addStyleName("view-content");
    content.setSizeFull();
    root.addComponent(content);
    root.setExpandRatio(content, 1.0f);

    navigator = new Navigator(this, content);
    navigator.addProvider(viewProvider);
    navigator.navigateTo(DashboardView.NAME);
}
}