2012-03-04 2 views
2

CDI/EJB 어노테이션을 스프링 어프로치로 대체하려고합니다. 그러나 나는 그것을 올바르게하는 방법을 고심하고있다. 무엇 무 상태에 대한CDI/EJB 어노테이션을 스프링 어노테이션으로 마이그레이션하기

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

:

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


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

는 지금은 다음과 같습니다

이것은 내가 CDI/EJB에서이 무엇인가? 봄에 aquivalent 무엇입니까? 또한

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

는 단순히 @Autowired 모든 @Inject 주석을 교체해야합니까 명백한 난 그냥 다음, BC을이 주석을 제거 할 수 없습니다 나는이 예외를 받고 있어요? EL 이름 지정을 처리하는 스프링이있어서 @Named을 제거 할 수 있습니까?

도 JPA 엔티티에 주석을 추가해야합니까?

+3

왜 이렇게할까요? 화염 전쟁을 시작하려하지 않고 호기심을 자극합니다. – NBW

+0

봄철 주석은 일을 아주 쉽게 만듭니다. 애스 팩트 등 모든 @Component 주석이 적용된 클래스에서 예외를 catch 할 수 있습니다. – membersound

+1

EE6/EJb 3.1/CDI는 주석, 인터셉터 등과 같은 aspect 기능을 제공합니다. – NBW

답변

1

StatelessStateful 콩은 EJB 개념이지만, Spring은 서비스 콩을 통해 유사한 서비스를 제공합니다. @Service 어노테이션을 비즈니스 로직 클래스에 넣고 bean을 "Stateless"또는 "Stateful"이되도록하려면 bean 범위 (예 : Request 또는 Session)를 구성하십시오.

Spring 또한 내장 된 트랜잭션 관리 API를 가지고, 그래서 당신의 거래 주석을 변경해야 할 수도 있습니다.

마지막으로, Spring 많은 지속성 프레임 워크 JPA 등과 호환됩니다. 당신이 OK입니다 JPA 유지하고, 당신이 (아마도 Hibernate, 또는 MyBatis를) 원하는 경우 다른 기술을 변경할 부담 할 경우

1

상태 비 저장 및 상태 보존 개념은 EJB입니다. 봄에는 그런 개념이 없습니다. Spring은 상태 저장 빈을 지원하지 않고 POJO를 사용한다. 너는 너 자신에있어.

는 봄 javax.annotation.Resource 주석을 사용한다 나는 @Autowired에 그걸 좋아할 것입니다.

1

봄 직접 @Inject@Named 지원합니다. 원치 않는 경우 @Autowired@Component (봄철 상당)을 사용할 필요가 없습니다. @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; 
} 
관련 문제