0

我有两个 Maven 模块:

  1. 逻辑(带有 bean 等的 Spring 项目) - 打包到 .jar

  2. 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 始终为空。

我应该添加什么来从 Web 模块中可见的逻辑模块中获取 bean?

界面类:

@Theme("mytheme")
@SuppressWarnings("serial")
@Controller
public class MyVaadinUI extends UI
{ }

我也在这里提到了 vaadin V7:在此处输入链接描述

但无济于事。

这是我的 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);
}

}

4

2 回答 2

0

您可以将 UI 拆分为 2 层 - 视图 (UI) 和控制器(视图和逻辑类之间的中间类)。您的控制器可以从视图以标准方式创建,即使用操作符。

然后用 @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> 

我在我的项目中使用这种方法并且效果很好。

于 2013-07-22T18:49:05.483 回答
0

你没有展示你的 UI 类。我怀疑 UI 不是 Spring 托管的 bean,因此自动装配已关闭。或者您的 UI 被注释为 Spring bean,但使用new运算符创建,而不是从 Spring 上下文中获取。

好吧,如果你按照你的解释做了,它必须工作。没有怜悯。我做了一个简单的项目https://github.com/michaldo/multi-module-vaadin-spring它可以工作

于 2013-07-11T20:57:59.430 回答