【问题标题】:Vaadin URL mapping issues: sub-path URL mapping and automatic URL mapping not workingVaadin URL 映射问题:子路径 URL 映射和自动 URL 映射不起作用
【发布时间】:2017-07-12 12:30:36
【问题描述】:

面对这些问题 w.r.t Vaadin UI 和 URL 映射。

问题1:

我正在尝试将 Vaadin 用于我的实体的基本 CRUD 操作。首先,我想向 /subpath/xyz url 公开一个 UI 类。但是子路径 url 映射在某种程度上不起作用。 (请注意,当我保留或删除 @Spring(path="myui") 时,它仍然映射到 localhost:8080/myui/ 而不是 localhost:8080/subpath/myui/

我错过了什么?

我一直在关注 Vaadin 的文档,但到目前为止还没有运气。 https://vaadin.com/docs/-/part/framework/application/application-environment.html#application.environment.servlet-mapping

问题2: 此外,Vaadin 不会从类名自动生成 url 映射。例如。如果我没有在@SpringUI 中提供路径属性(根据 Vaadin 的文档),MyUI 类名应该映射到 localhost:8080/my-ui/。

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.Title;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.server.VaadinRequest;
import com.vaadin.spring.annotation.SpringUI;
import com.vaadin.spring.server.SpringVaadinServlet;
import com.vaadin.ui.*;


import javax.servlet.annotation.WebServlet;

@Theme("valo")
@Title("My UI")
@SpringUI(path="myui")
public class MyUI extends UI {
    @Override
    protected void init(VaadinRequest request) {
        // Create the content root layout for the UI
        VerticalLayout content = new VerticalLayout();
        setContent(content);

        // Display the greeting
        content.addComponent(new Label("Hello World!"));

        // Have a clickable button
        content.addComponent(new Button("Click Me!",
            click -> Notification.show("Clicked!")));
    }
    @WebServlet(urlPatterns = {"/admin/*", "/VAADIN/*"}, name = "MyUIServlet", asyncSupported = true)
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
    public static class MyUIServlet extends SpringVaadinServlet {
    }

}

【问题讨论】:

    标签: java spring vaadin


    【解决方案1】:
        package vaadinUI;
    
        import com.vaadin.annotations.Theme;
        import com.vaadin.annotations.Title;
        import com.vaadin.annotations.VaadinServletConfiguration;
        import com.vaadin.server.VaadinRequest;
        import com.vaadin.spring.annotation.SpringUI;
        import com.vaadin.spring.server.SpringVaadinServlet;
        import com.vaadin.ui.*;
    
    
        import javax.servlet.annotation.WebServlet;
    
        @Theme("valo")
        @Title("My UI")
        @SpringUI(path="myui/subpath")
        public class MyUISubPath extends UI {
            @Override
            protected void init(VaadinRequest request) {
                // Create the content root layout for the UI
                VerticalLayout content = new VerticalLayout();
                setContent(content);
    
                // Display the greeting
                content.addComponent(new Label("Hello World!"));
    
                // Have a clickable button
                content.addComponent(new Button("Click Me!",
                    click -> Notification.show("Clicked!")));
            }
        }
    
    
    package vaadinUI;
    
    import com.vaadin.annotations.Theme;
    import com.vaadin.annotations.Title;
    import com.vaadin.annotations.VaadinServletConfiguration;
    import com.vaadin.server.VaadinRequest;
    import com.vaadin.spring.annotation.SpringUI;
    import com.vaadin.spring.server.SpringVaadinServlet;
    import com.vaadin.ui.*;
    
    
    import javax.servlet.annotation.WebServlet;
    
    @Theme("valo")
    @Title("My UI")
    @SpringUI(path="myui")
    public class MyUI extends UI {
        @Override
        protected void init(VaadinRequest request) {
            // Create the content root layout for the UI
            VerticalLayout content = new VerticalLayout();
            setContent(content);
    
            // Display the greeting
            content.addComponent(new Label("Hello World!"));
    
            // Have a clickable button
            content.addComponent(new Button("Click Me!",
                click -> Notification.show("Clicked!")));
        }
    }
    

    我正在使用 8.0.X,这对我有用。你可能需要改变一些事情。在不同的路径中重用相同的 UI 类可能不是那么可取的。或者框架通过设计拒绝了这个

    问题 2:“一个空字符串(默认)会将 UI 映射到 servlet 的根”,我读它的方式是映射到 ....:8080/

    编辑

    误读的文档版本

    编辑

    我试过你的代码,它的行为也和我描述的一样。 @SpringUI() 映射到根目录,路径映射到路径。映射到 myui/subpath 的 UI 按预期工作。所以我会从一个新项目开始,然后刷新 .m2 存储库。

    仅供参考,@WebServlet 中的值优先于 @VaadinServletConfiguration 中的值

    您是否在浏览器端刷新/重新加载?您可以重新启动容器(完全蛮力)并重新加载页面以查看它是否有所作为

    【讨论】:

    • 其实文档现在默认是v8的,而v7有不同的路径https://vaadin.com/docs7/-/part7.....
    • 我使用与 spring 1.5.3 版本相同的版本,并且我发布的代码按照答案中的描述工作。 @SpringUI() 映射到 servlet 的根,@SpringUI(path="myui") 映射到 /myui。 @SpringUI(path="myui/subpath") 映射到 /myui/subpath。
    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    相关资源
    最近更新 更多