2012-03-04 15 views
2

CDI/EJBアノテーションをSpringのアノテーションに置き換えようとしています。しかし、私はそれを正しくする方法を奮闘しています。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; 
} 

何ステートレスについて?何が春にaquivalentですか?私はこの注釈を削除することはできません は明白で、BCは、私はこれらの例外を取得しています。さらに

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注釈を交換する必要がありますか? ELネーミングを処理する何かが春にあるので、@Namedを削除できますか?

JPAエンティティにも注釈を付ける必要がありますか?

+3

なぜこれをやりたいですか?炎の戦争を開始しようとしていない、ちょうど好奇心。 – NBW

+0

バネのアノテーションは非常に簡単です。例えばアスペクトはすべての@Componentアノテートされたクラスで例外をキャッチできます。 – membersound

+1

EE6/EJb 3.1/CDIは注釈、インターセプタなどでこのようなアスペクト機能も提供しています。その場合、私は切り換えようと努力する中で値を見ませんが、私だけです。 – NBW

答えて

1

StatelessおよびStateful豆はEJBの概念ですが、Springはサービス豆で同様のサービスを提供します。 @Service注釈をビジネスロジッククラスに入れて、Beanスコープ(RequestまたはSessionなど)を設定するだけで、Beanを「ステートレス」または「ステートフル」にしたい場合は、Beanスコープを設定します。

Springにはトランザクション管理APIが組み込まれているため、トランザクション注釈を変更する必要があります。

最後に、Springは、JPAを含む多くの永続フレームワークと互換性があります。あなたがJPAを維持したい場合、それはOKです、そしてあなたが(多分Hibernate、またはMyBatis)を望むならば、他の技術のためにそれを変更すること自由に感じ

1

ステートレスとステートフルの概念はEJBです。春にはそのような概念はない。 SpringはステートフルBeanをサポートせずに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; 
} 
関連する問題