2013-07-11 158 views
0

我有兩個Maven的模塊:多模塊Maven的春天注入豆

  1. 邏輯(豆等Spring項目) - 包裝到的.jar

  2. 網絡(與春天,大自然Vaadin項目) - 數據包到.war

在網絡.pom我有依賴邏輯。在Java代碼自動裝配等是可以的。 我想在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包含用於邏輯模塊豆配置。基本包名稱是b2b。

在UI I類有:

@Autowired 
private CompanyService companyService; 

我嘗試很多方法可以讓豆子,但始終companyService是啓動網絡後空。

我應該添加什麼來獲取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

你沒有提出你的UI類。我懷疑UI不是Spring管理bean,因此自動裝配關閉。或者你的UI被註釋爲Spring bean,但是用新的運算符創建,而不是從Spring上下文中獲取。

那麼,如果你按照你的解釋做了它,它必須工作。沒有憐憫。我做了一個簡單的項目https://github.com/michaldo/multi-module-vaadin-spring,它的工作原理

0

你可以在2層 - 視圖(UI)和控制器(視圖和你的邏輯類之間的中間類)中拆分你的用戶界面。您的控制器可以通過標準方式創建,即使用新的操作員。

然後用@Configurable註解你的控制器類:

@Configurable 
public class MyController 
{ 
    @Autowired 
    private MyService service; 
} 

配置告訴Spring創建了Spring上下文的這個bean應該還是依賴注入的主題。爲了使這項工作,你需要在你的classpath AspectJ運行+添加AspectJ的編譯階段到您的構建 - 改變的pom.xml的UI項目如下:

<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> 

在我的項目中,我使用這種方法和工作得很好。