【问题标题】:Migrating CDI/EJB annotations to Spring annotations将 CDI/EJB 注释迁移到 Spring 注释
【发布时间】:2012-03-22 07:52:01
【问题描述】:

我正在尝试将我的 CDI/EJB 注释替换为 Spring 注释。但我正在努力如何正确地做到这一点。

这就是我在 CDI/EJB 中所拥有的:

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
class Service {
    @Inject
    EntityManager em;
}


@Named
@RequestScoped
class Facade {
    @Inject
    Service service;
}

现在我将执行以下操作:

@Stateless
@Transactional
@Repository
class Service {
    @Inject
    EntityManager em;   
}

无国籍人呢?春天的当量是什么? 显然我不能只删除这个注释,然后我得到这些异常:

javax.el.PropertyNotFoundException: /input.xhtml @15,30 registerButtonAction="#{facade.createNew()}": The class 'Facade$Proxy$_$$_WeldClientProxy' does not have the property ...

进一步:

@Named
@Service
class Facade {
    @Autowired
    Service service;
}

我是否必须简单地将所有@Inject 注释替换为@Autowired? Spring中是否有处理EL命名的东西,以便我可以删除@Named

我是否也必须注释我的 JPA 实体?

【问题讨论】:

  • 您为什么要这样做?不是想发起一场火焰战争,只是好奇。
  • bc spring 注释使事情变得非常容易。例如方面,可以捕获所有 @Component 注释类的异常。
  • EE6 / EJb 3.1 / CDI 还提供了带有注释、拦截器等的方面功能。在这种情况下,我看不到切换的价值,但这只是我自己。

标签: java spring jakarta-ee ejb cdi


【解决方案1】:

无状态和有状态的概念是EJB; Spring没有这样的概念。 Spring 使用 POJO,不支持有状态 bean。你自己在那里。

Spring使用javax.annotation.Resource注解;我更喜欢@Autowired

【讨论】:

    【解决方案2】:

    StatelessStateful Bean 是EJB 的概念,但Spring 通过Service Bean 提供类似的服务。将@Service 注释放在您的业务逻辑类中,如果您希望您的bean 是“无状态”或“有状态”,只需配置您的bean 范围(如RequestSession)。

    Spring 还具有内置的事务管理 API,因此您的事务注释可能需要更改。

    最后,Spring 与包括JPA 在内的许多持久性框架兼容。如果您想保留JPA,那没关系,如果您愿意,可以随意将其更改为其他技术(可能是Hibernate,或MyBatis

    【讨论】:

      【解决方案3】:

      Spring 直接支持@Inject@Named。如果您不想,则无需使用@Autowired@Component(Spring 的等效项)。也不需要带上@Resource

      // This is a singleton by default, which is OK since you previously
      // had it marked as stateless
      @Named
      @Transactional(propagation=Propagation.REQUIRES_NEW)
      class Service {
          @PersistenceContext   // Use JPA's usual annotation
          EntityManager em;
      }
      
      // You may not still need this, but if you do ...
      @Named
      @Scope("request")
      class Facade {
          @Inject
          Service service;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多