【问题标题】:Vaadin-spring autowiredVaadin 弹簧自动连线
【发布时间】:2016-02-29 09:19:08
【问题描述】:

我有一个 vaadin 项目,我需要使用 @Autowired Spring 注释。所以我使用了 vaadin-spring 插件

<dependency>
   <groupId>com.vaadin</groupId>
   <artifactId>vaadin-spring</artifactId>
   <version>1.0.0</version>
</dependency>

现在,如果我在 UI 类中定义自动装配类,它可以正常工作。但是如果我在另一个类中定义自动装配类,这个类总是空的。例如,在这种情况下,“serv”始终为 null。

@SuppressWarnings("serial")
public class ProfileWindow extends Window {

    @Autowired
    private Servizio serv;

    ...
    ...

    private Component buildFooter() {
        HorizontalLayout footer = new HorizontalLayout();
        footer.addStyleName(ValoTheme.WINDOW_BOTTOM_TOOLBAR);
        footer.setWidth(100.0f, Unit.PERCENTAGE);

        Button ok = new Button("OK");
        ok.addStyleName(ValoTheme.BUTTON_PRIMARY);
        ok.addClickListener(new ClickListener() {
            @Override
            public void buttonClick(ClickEvent event) {
                Dati dd = new Dati(Double.parseDouble(nomeField.getValue()), Double.parseDouble(cognomeField.getValue()));

                String out = serv.converti(dd);

                Notification success = new Notification(out);
                success.setDelayMsec(2000);
                success.setStyleName("bar success small");
                success.setPosition(Position.BOTTOM_CENTER);
                success.show(Page.getCurrent());

                BsciEventBus.post(new ProfileUpdatedEvent());
                close();


            }
        });
        ok.focus();
        footer.addComponent(annulla);
        footer.setComponentAlignment(annulla, Alignment.TOP_LEFT);
        footer.addComponent(ok);
        footer.setComponentAlignment(ok, Alignment.TOP_RIGHT);

        return footer;
    }   
}

ServizioImpl.java

@SpringComponent
public class ServizioImpl implements Servizio {

    @Override
    public String converti(Dati dati) {

        //implementation...
        return "out";
    }

}

你能帮我使用自动连线注释吗?

您有一些示例代码可以推荐吗?我不明白如何解决这个问题。 如果我在 ProfileWindow 上使用 @SpringComponent,自动装配的注释还不起作用。

谢谢

【问题讨论】:

  • Spring 只能在它创建的对象中自动装配字段。它无法知道您已经手动创建了一个新实例。因此ProfileWindow 也必须是一个 Spring 组件,并且您必须从 Spring 上下文中获取它的实例,以便它的字段与其他组件的实例自动装配。
  • 抱歉,如果我在ProfileWindows 上使用@SpringComponent,自动连线不起作用。有没有办法在某个地方定义 Servizio bean,以便它可以被任何类调用?我会在 applicationContext.xml 中注册它
  • 使服务 bean 全局 可用是困难的(并非不可能),但它可能不是正确的做法。在更改ProfileWindow 后显示一些代码。您如何获得实例?您是否在构造函数中使用自动装配字段? (PS 欢迎来到 SO,在回复某人的评论时,您可以使用 @username 以便他们收到您的回复的通知)

标签: spring vaadin autowired vaadin7 spring-annotations


【解决方案1】:

如果您的类有一个注入成员,请确保该类本身是从 ApplicationContext 实例化的。例如,您可以使用context.getBean(ProfileWindow.class) 创建实例,或者类实例本身是托管类的注释成员。如果你用new 实例化你的ProfileWindow 类,那么注入机制就不起作用了。

【讨论】:

    【解决方案2】:

    谢谢大家,但我使用 vaadin spring 集成插件解决了这个问题

    <dependency>
        <groupId>ru.xpoft.vaadin</groupId>
        <artifactId>spring-vaadin-integration</artifactId>
        <version>3.2</version>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 2015-09-17
      • 2017-11-11
      相关资源
      最近更新 更多