将CDI / EJB注释迁移到Spring注释

时间:2012-03-04 16:16:57

标签: java spring java-ee ejb cdi

我正在尝试用Spring替换我的CDI / EJB注释。但我正在努力做到这一点。

这就是我在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实体?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

最后,Spring与许多持久性框架兼容,包括JPA。如果你想保留JPA就可以了,如果你愿意,可以根据其他技术改变它(可能HibernateMyBatis

答案 2 :(得分:1)

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