我有两个maven模块:
逻辑(带有bean等的Spring项目) - 打包到.jar
Web(具有弹性的Vaadin项目) - 数据包到.war
在Web .pom中我依赖于逻辑。在java代码中,autowired等是可以的。 我想在Web项目中使用来自逻辑的bean。
我的web.xml(Web项目):路径:../ src / main / webapp / WEB-INF
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml
</param-value>
</context-param>
我的应用程序上下文:(路径:../ src / main / webapp / WEB-INF)
<beans ...
<context:annotation-config />
<import resource="logic.xml"/>
<context:component-scan base-package="b2b"
annotation-config="true" />
logic.xml包含逻辑模块中bean的配置。基础包名称为b2b。
在UI类我有:
@Autowired
private CompanyService companyService;
我尝试以多种方式获取bean,但启动Web后,companyService始终为null。
我应该添加什么来从Web模块中看到逻辑模块中的bean?
UI类:
@Theme("mytheme")
@SuppressWarnings("serial")
@Controller
public class MyVaadinUI extends UI
{ }
我也在这里提到vaadin V7:enter link description here
但没有帮助。
这是我的UI类:
enter code here
@Theme("mytheme")
@SuppressWarnings("serial")
@Controller
public class MyVaadinUI extends UI
{
SpringContextHelper helper = new SpringContextHelper(VaadinServlet.getCurrent().getServletContext());
private static Logger LOGGER = Logger.getLogger(MyVaadinUI.class);
@WebServlet(value = "/*", asyncSupported = true)
@VaadinServletConfiguration(productionMode = false, ui = MyVaadinUI.class, widgetset = "b2b.frontend.AppWidgetSet")
public static class Servlet extends VaadinServlet {
}
@Override
protected void init(VaadinRequest request) {
final VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
setContent(layout);
final CompanyService companyService = (CompanyService) helper.getBean("companyService");
Button button = new Button("Click Me");
button.addClickListener(new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
//layout.addComponent(new Label("Thank you for clicking"));
LOGGER.info("pushed the button");
layout.addComponent(new Label("aa " +companyService +" Thank you for clicking"));
}
});
layout.addComponent(button);
}
}
答案 0 :(得分:0)
您没有展示您的UI类。我怀疑UI不是Spring托管bean,因此自动装配已关闭。或者您的UI注释为Spring bean,但是使用 new 运算符创建,而不是从Spring上下文中获取。
好吧,如果按照你的解释那样做,它必须有效。没有怜悯。我做了一个简单的项目https://github.com/michaldo/multi-module-vaadin-spring,它的工作原理
答案 1 :(得分:0)
您可以将UI分为两层 - 视图(UI)和控制器(视图和逻辑类之间的中间类)。您可以通过标准方式从视图创建控制器,即使用 new 运算符。
然后使用@Configurable:
注释您的控制器类@Configurable
public class MyController
{
@Autowired
private MyService service;
}
Configurable告诉Spring这个从Spring上下文创建的bean应该仍然是依赖注入的主题。为了完成这项工作,您需要在类路径上添加AspectJ运行时+在构建中添加aspectj编译阶段 - 更改ui项目的pom.xml,如下所示:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Aspectj plugin to make Spring aware of non-managed
beans and support autowiring -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.4</version>
<configuration>
<!-- Required as the plugin does not resolve this by default -->
<source>1.6</source>
<target>1.6</target>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
我在我的项目中使用这种方法并且效果很好。