我正在尝试将vaadin与spring(没有spring-boot)和基于java注释的spring部分配置相结合。
自动装配似乎在vadin -ui部分起作用,但在"自定义ui类"中不起作用。"公共类LoginScreen扩展CustomComponent")。我在SysOut上得到一个NPE或一个空对象。
进一步我注意到,"@ComponentScan(basePackages={"net.myapp"})"不是扫描bean。声明bean的唯一方法是在CustomConfiguration本身中。
XML-Configuration不是我喜欢的东西。
我遵循这个教程:链接
CustomConfiguration.java
@Configuration
@ComponentScan(basePackages={"net.myapp"})
@EnableVaadin
public class CustomConfiguration {
// this is working but i want to use componentscan!
@Bean
public String test() {
return "test...";
}
@Bean
public TestBean testBean() {
return new TestBean();
}
@Bean
public LoginScreen loginScreenBean() {
return new LoginScreen();
}
}
SpringVaadinServlet.java
@WebServlet(value = "/*", asyncSupported = true)
@VaadinServletConfiguration(productionMode = false, ui = Application.class)
@SuppressWarnings("serial")
public class SpringVaadinServlet extends VaadinServlet implements SessionInitListener {
@Autowired
protected VaadinUIProvider applicationProvider;
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
AutowireCapableBeanFactory ctx = ((ApplicationContext)
getServletContext().getAttribute("applicationContext")).getAutowireCapableBeanFactory();
ctx.autowireBean(this);
}
@Override
protected void servletInitialized() {
getService().addSessionInitListener(this);
}
@Override
public void sessionInit(SessionInitEvent event) throws ServiceException {
event.getSession().addUIProvider(applicationProvider);
}
}
VaadinUIProvider.java
@SpringComponent
@SuppressWarnings("serial")
public class VaadinUIProvider extends UIProvider {
@Autowired
ApplicationContext applicationContext;
@Override
public Class<? extends UI> getUIClass(UIClassSelectionEvent event) {
return Application.class;
}
@Override
public UI createInstance(UICreateEvent event) {
UI instance = new Application();
System.out.println("applicationContext is null? " + applicationContext);
applicationContext.getAutowireCapableBeanFactory().autowireBean(instance);
return instance;
}
}
SpringApplicationContextListener.java
@WebListener
public class SpringApplicationContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(CustomConfiguration.class);
sce.getServletContext().setAttribute("applicationContext", applicationContext);
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
Application.java
@Theme("mytheme1")
@SpringUI
@SuppressWarnings("serial")
public class Application extends UI {
@Autowired
private TestBean testBean;
@Autowired
private String test;
@Override
protected void init(VaadinRequest vaadinRequest) {
// working
System.out.println("init testBean: " + testBean);
System.out.println("init test: " + test);
Window window = new Window();
window.setContent(new LoginScreen());
window.setClosable(false);
window.setWidth("400px");
window.setHeight("280px");
window.setModal(true);
window.setDraggable(false);
window.setResizable(false);
window.center();
addWindow(window);
setSizeFull();
}
}
和下面的"custom-ui class"LoginScreen.java
@UIScope
@SuppressWarnings("serial")
public class LoginScreen extends CustomComponent {
public static final String VIEW_NAME = "";
final FormLayout layout = new FormLayout();
TextField userName = new TextField();
TextField passWord = new TextField();
Button submit = new Button("Submit");
@Autowired
private TestBean testBean;
@Autowired
private String test;
public LoginScreen() {
userName.setCaption("Benutzername:");
passWord.setCaption("Passwort:");
// not working (null)
System.out.println("loginscreen test: " + testBean);
System.out.println("loginscreen test: " + test);
setSizeFull();
}
}
窗口。setContent (新LoginScreen () );
如果你想要@Autowired
注释的字段被注入,Spring应该创建LoginScreen
。
在Application
类中注入LoginScreen
实例