vaadin-spring引入了两个spring范围的对象,即vaadin-session
和vaadin-ui
范围。在引用spring上下文中的任何Vaadin对象之前,有必要绑定这两个作用域,如果:
- 它们用
@VaadinSessionScope
或@UIScope
注释进行装饰,或者 - 它们通过一些依赖链引用任何以这种方式修饰的bean
当您在jboss或tomcat这样的servlet容器中启动它时,所有操作都运行得非常好。问题是:
如果您想加载一个spring应用程序上下文,其中包含任何为单元测试目的而装饰的vaadin-beans,那么如何创建一个最小的测试,允许在不启动web应用程序容器的情况下加载和访问上下文
Spring MVC在这方面做得很好,但当您使用vaadin-Spring时,它就不那么简单了——相关的vaadin组件是高度连接的。
(以下关于如何构建一组Vaadin组件以允许通过上述范围进行访问的示例不包括完整容器的配置,只是获得正常运行的应用程序上下文所需的最低配置。)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class)
@WebAppConfiguration
public class SpringConfigurationTest extends Assert {
@Configuration
@ComponentScan({ "org.example" }) // contains SomeClassReferencingASpringVaadinBean.class
public static class Config {
}
@Autowired
WebApplicationContext applicationContext;
class MyDeploymentConfiguration extends DefaultDeploymentConfiguration {
public MyDeploymentConfiguration(Class<?> servletClass, Properties initParameters) {
super(servletClass, initParameters);
initParameters.put(Constants.SERVLET_PARAMETER_UI_PROVIDER, DefaultUIProvider.class.getName());
}
}
class MyVaadinServlet extends VaadinServlet {
@Override
public String getServletName() {
return getClass().getSimpleName();
}
}
class MyUI extends UI {
@Override
protected void init(VaadinRequest request) {
}
}
@Before
public void setupVaadinScopes() throws Exception {
MyVaadinServlet vaadinServlet = new MyVaadinServlet();
MyDeploymentConfiguration deploymentConfiguration = new MyDeploymentConfiguration(MyVaadinServlet.class,
new Properties());
VaadinServletService vaadinService = new VaadinServletService(vaadinServlet, deploymentConfiguration);
VaadinServletRequest vaadinRequest = new VaadinServletRequest(new MockHttpServletRequest(), vaadinService);
// creates vaadin session and vaadin ui, binds them to thread
VaadinSession vaadinSession = vaadinService.findVaadinSession(vaadinRequest);
Integer uiId = Integer.valueOf(vaadinSession.getNextUIid());
UI ui = new MyUI();
ui.setSession(vaadinSession);
UI.setCurrent(ui);
ui.doInit(vaadinRequest, uiId, null);
vaadinSession.addUI(ui);
}
@Test
public void test0() {
try {
applicationContext.getBean(SomeClassReferencingASpringVaadinBean.class);
} catch (Exception e) {
fail("scopes were probably not set up correctly");
}
}
}