【问题标题】:call spring bean from vaadin button click从 vaadin 按钮调用 spring bean 点击
【发布时间】:2014-11-28 12:33:02
【问题描述】:

我有带有注释@Component 的窗口类实现。在这个类中,我用注释@Autowired 声明对象。

在我的窗口窗体上,我有一个按钮Create,它应该从TextFields 读取数据,创建新对象并将其存储在数据库中。

@Component("newProjectWindow")
public class NewProjectWindow {

    private Window createProjectWindow;

    @Autowired
    private ProjectService service;

    public Window createWindow() {
        createProjectWindow = new Window("New project");
        initWindow();
        fillWindow();

        return createProjectWindow;
    }

    private void initWindow() {
        createProjectWindow.setSizeUndefined();
        createProjectWindow.setResizable(false);
        createProjectWindow.setModal(true);
        createProjectWindow.addCloseListener(new CloseListener(){

            @Override
            public void windowClose(CloseEvent e) {
                Notification.show("Closed");
            }

        });
    }

    private void fillWindow() {
        final TextField projectName = new TextField("Project name");
        final TextField projectOwner = new TextField("Project owner");
        Button create = new Button("Create");
        create.addClickListener(new Button.ClickListener() {

            @Override
            public void buttonClick(ClickEvent event) {
                Project newProject = new Project();
                newProject.setProjectName(projectName.getValue());
                newProject.setProjectOwner(projectOwner.getValue());
                //save it somehow
            }
        });

        Button close = new Button("Cancel");
        close.addClickListener(new Button.ClickListener() {

            @Override
            public void buttonClick(ClickEvent event) {
                createProjectWindow.close();
            }
        });

        HorizontalLayout layout = new HorizontalLayout(create, close);
        FormLayout formLayout = new FormLayout(projectName, projectOwner, layout);
        formLayout.setMargin(true);

        createProjectWindow.setContent(formLayout);
    }

}

但是问题是如何在数据库中存储对象。我无法访问实例化的ProjectService(它使用ProjectRepisitory,它使用SqlSessionTemplate 等),因为它受Spring 的控制 - 而匿名ClickListener 不是。

但是如何存储对象呢?

【问题讨论】:

    标签: java spring vaadin


    【解决方案1】:

    我倾向于不对点击监听器使用匿名内部方法,而是让我自己的类来实现 ClickListner。因此,在您的示例中,我将像这样更改类:

    @Component("newProjectWindow")
    public class NewProjectWindow {
    
        private Window createProjectWindow implements Button.ClickListener;
    
        @Autowired
        private ProjectService service;
        private Button create = new Button("Create", this);
        private Button cancel new Button("Cancel", this);;
    
        public Window createWindow() {
            createProjectWindow = new Window("New project");
            initWindow();
            fillWindow();
    
            return createProjectWindow;
        }
    
        private void initWindow() {
            createProjectWindow.setSizeUndefined();
            createProjectWindow.setResizable(false);
            createProjectWindow.setModal(true);
            createProjectWindow.addCloseListener(new CloseListener(){
    
                @Override
                public void windowClose(CloseEvent e) {
                    Notification.show("Closed");
                }
    
            });
        }
    
        private void fillWindow() {
            final TextField projectName = new TextField("Project name");
            final TextField projectOwner = new TextField("Project owner");
    
    
            HorizontalLayout layout = new HorizontalLayout(create, close);
            FormLayout formLayout = new FormLayout(projectName, projectOwner, layout);
            formLayout.setMargin(true);
    
            createProjectWindow.setContent(formLayout);
        }
    
    
        @Override
        public void buttonClick(ClickEvent event) {
    
             if (event.getButton() == cancel)
             {
                  createProjectWindow.close();
             }
             else
             {
    
                  Project newProject = new Project();
                  newProject.setProjectName(projectName.getValue());
                  newProject.setProjectOwner(projectOwner.getValue());
                  //save it somehow
             }
         }
    
    }
    

    【讨论】:

      【解决方案2】:

      要在您的示例中从侦听器访问服务,请考虑以下解决方案:

      • 匿名内部类可以引用外部类(使用 OuterClassName.this 语法 - 在您的情况下为 NewProjectWindow.this.service)。
      • 您可以声明(内部)类并将适当的引用传递给它。
      • 您可以使用自己实现监听器接口的父类的Chris M suggestion

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-23
        • 2015-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多