如何在常规Web应用程序中使用Spring Roo域模型

时间:2012-03-07 04:57:58

标签: spring-roo

我使用Roo构建了一个小模型。模型中有6个对象有各种关系 - 它很整洁,耗时20分钟!现在我拥有它,我想创建Spring MVC项目并使用域模型 - 但我想保持Web项目与Roo项目完全分离(我不了解Spring MVC在Roo中使用脚手架)。

所以我在web项目的pom.xml中创建了依赖项,我可以使用'mvn tomcat:run'构建和部署web项目。但是,当Web尝试使用Spring Roo对象时,我会得到如下例外:

java.lang.IllegalStateException: Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)
at com.loquatic.clcmops.consignortool.entities.Consignor_Roo_Jpa_ActiveRecord.entityManager_aroundBody0(Consignor_Roo_Jpa_ActiveRecord.aj:19)
at com.loquatic.clcmops.consignortool.entities.Consignor_Roo_Jpa_ActiveRecord.ajc$interMethod$com_loquatic_clcmops_consignortool_entities_Consignor_Roo_Jpa_ActiveRecord$com_loquatic_clcmops_consignortool_entities_Consignor$entityManager(Consignor_Roo_Jpa_ActiveRecord.aj:1)
at com.loquatic.clcmops.consignortool.entities.Consignor.entityManager(Consignor.java:1)

我在一个项目的独立项目中完成了这个项目,其中我有一个具有main()方法的类,我必须添加一行代码才能正确加载上下文(这基本上是这样的:How to use JUnit tests with Spring Roo? (Problems with EntityManager) )。这是Spring MVC我有点认为它是自动发生的 - 我显然是错的。

那么我是否需要在Web项目中执行某些操作来获取为Roo jar文件加载的上下文?或者我是否需要在roo jar文件项目中更改某些内容?我是否需要注释一个控制器,以使这个快乐?

我尝试将以下内容添加到Web项目的pom.xml中:

       <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>   

   <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>${org.aspectj-version}</version>
    </dependency>   
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>${org.aspectj-version}</version>
    </dependency>   

但这并没有改变任何事情 - 这也是一些严肃的猜测工作。

任何人都有任何指示?您如何在另一个不一定是Roo项目的项目中使用Spring域模型?

谢谢!

1 个答案:

答案 0 :(得分:0)

首先,我认为没有任何逻辑上的理由将域代码与控制器代码分开。请记住,我是从一个人工作的角度说的,这个人工作在包含数万个类的巨大应用程序中,所有这些都被分类到Eclipse中的大约15个不同的子项目中。这大部分是使用Spring构建的,但没有Roo。

我认为你需要做的就是这个。首先,您需要创建一个Maven主项目。不是JAR或WAR项目,只是一个主“容器”。我忘记了确切的maven命令,但有一个创建一个空的父POM和所有。

一旦你有“主”设置,你就会创建两个子POM,一个用于域名,一个用于WAR。主人将决定你需要编译的顺序。通常,它的低级库首先是高级项目,最后是一些WAR项目。您的WAR项目POM应设置为引入更高级别的项目,而更高级别的项目POM应该引入您的低级库。

我们用作基本层次结构的是:

'master'
  - components
      - 'lib 1'
      - 'lib 2'
  - apps
      - 'app 1'
          - 'app 1'_jar
          - 'app 1'_war
      - 'app 2'
          - 'app 2'_jar
          - 'app 2'_war

这是工作中项目的基本布局,''中的项目将替换您正在使用的任何名称。不要问我为什么我们这样做,多年前的讨论可能会或可能不再相关。底线:它过分,但它有效。

一旦设置好项目层次结构,就需要从Eclipse中删除所有项目。只是删除它们...他们是设置与Roo这样的,并且它不会玩将与Roo的东西做非Roo的东西。然后运行你的:

mvn eclipse:clean eclipse:eclipse

通常您可以从顶级项目执行此操作,但有时您必须单独执行每个子项目。

我还建议你看一下Spring Roo如何处理Spring MVC。这真的是一个很好的实现,很好地使用Aspects,并且易于学习和使用。