简体   繁体   English

Spring Boot,Vaadin - 无法在视图中自动装配服务

[英]Spring boot, Vaadin - cant autowire Service in a View

I have spring boot application with vaadin and vaadin4spring addon.我有带有 vaadin 和 vaadin4spring 插件的 Spring Boot 应用程序。 In one my View i want to display a data which are in database.在我的视图中,我想显示数据库中的数据。 Data i want to display are returned by a method in service class.我要显示的数据由服务类中的方法返回。

@Service
public class UserService {
    public List<Users> getUsers() ....
}

View:看法:

@SpringView(name = Views.USERLIST) //static constant containing string "users"
public class UserlistView extends HorizontalLayout implements View {
    @Autowired
    private UserService userService;
    @PostConstruct
    public void construct() {
        displaytable(userService.getUsers());
    }
    @Override
    public void enter(ViewChangeListener.ViewChangeEvent viewChangeEvent) {}

}

UI class:

@SpringUI
@Theme("valo")
public class TUI extends UI {
        @Autowired
        private SpringViewProvider springViewProvider;

        protected void init(VaadinRequest request) {
          ..
          Navigator navigator = new Navigator(this, content);
           navigator.addView(Views.USERLIST, UserlistView.class);
          navigator.addProvider(springViewProvider);

        }
}

During the server startup vaadin recognizes the springview - " cvspring.navigator.SpringViewProvider : 1 SpringView found", no exceptions or warnings are displayed.在服务器启动期间 vaadin 识别 springview - “cvspring.navigator.SpringViewProvider : 1 SpringView found”,没有显示任何异常或警告。

Every time i use navigator display the view ( navigator.navigateTo("users") ) autowired field in the view is not injected and the postprocess method not called.每次我使用 navigator 显示视图( navigator.navigateTo("users") )时,视图中的自动装配字段都没有注入,也没有调用 postprocess 方法。 What is even stranger if i dont add the view into the navigator object and use url to access the view directly - localhost:8080/#!users the fields will be injected correctly and method construct() will be called.如果我不将视图添加到导航器对象中并使用 url 直接访问视图,那么更奇怪的是 - localhost:8080/#!users 字段将被正确注入并调用方法构造()。

If it helps there is my configuration class如果有帮助,那就是我的配置类

@Configuration
@ComponentScan(basePackages = { "me.project" })
@EnableAutoConfiguration
@EnableVaadinEventBus
public class TheConfig {
    // contains only one bean definition - sessionfactory
}

Has anyone faced similar problem?有没有人遇到过类似的问题? I was not able to find help anywhere could anyone please tell me what i did wrong.我无法在任何地方找到帮助,任何人都可以告诉我我做错了什么。 Thank you谢谢

When you do当你做

navigator.addView(Views.USERLIST, UserlistView.class);

It creates a StaticViewProvider which is not handled by Spring and creates a view using 'new'.它创建一个StaticViewProvider Spring 处理的StaticViewProvider并使用“new”创建一个视图。 So no spring autowiring happens for 'addView' If you use springViewProvider Autowiring is handled by Spring.因此,'addView' 不会发生 spring 自动装配如果您使用 springViewProvider 自动装配由 Spring 处理。

So do not do navigator.addView() , instead rely on springViewProvider when using Spring+Vaadin.所以不要做navigator.addView() ,而是在使用 Spring+Vaadin 时依赖springViewProvider

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM