2012-04-27 17 views
11

私は2種類のリポジトリを管理する次のコードを持っています。両方のリポジトリクラスは、リソースを再初期化できるようにインタフェースを継承します。注入点で修飾子[@Default](CDIで@Stateful EJBを使用)のタイプ[...]に対する満足していない依存性

public interface CachingRepository 
{ 
    public void invalidateCache(); 
} 

グローバル、アプリケーションスコープレポ:ユーザごと

@Named("globalRepo") 
@ApplicationScoped 
public class GlobalRepository implements CachingRepository 
{ 
    private List<Category> categories; 

    ... 

    @Override 
    public void invalidateCache() 
    { 
     categories = null; 
    } 

    ... 
} 

、セッションスコープレポ:

@Named("userRepo") 
@SessionScoped 
//@Stateful   // <- NOTE HERE 
public class UserRepository implements CachingRepository, Serializable 
{ 
    private List<MyFile> files; 

    @Override 
    public void invalidateCache() 
    { 
     files = null; 
    } 

    ... 
} 

コンテキスト

@Named 
@ViewScoped 
public class MyHandler implements Serializable 
{ 
    @Inject 
    private UserRepository userRepo; 

    ... 
} 
に( @Statefulせず)にこれを注入します

それは動作します。

Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [UserRepository] with qualifiers [@Default] at injection point [[field] @Inject private de.company.project.pack.MyHandler.userRepo] 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:275) 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:244) 
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:107) 
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:127) 
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:346) 
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:331) 
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366) 
    at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:83) 
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:76) 
    ... 5 more 

は同じ例外中

@Inject @Named("userRepo") 
private UserRepository userRepo; 

結果などのCDI Beanの名前を追加:UserRepositoryクラスに@Statefulを追加するときただし、展開は言って例外で失敗します。 @Statefulと連携して動作唯一のものは、VAR宣言でインタフェースを使用することです:

@Inject @Named("userRepo") 
private CachingRepository userRepo; 

私は本当に(現時点では)望ましくないCachingRepositoryを使用して、しかしここでは、サブクラスの機能が必要になる場合があります。

Qの:予想通り

  1. なぜこの作業ではないでしょうか? UserRepository varは、インスタンス化するクラスを既に識別しているはずです。これに対する論理は何ですか?
  2. @Stateful EJBアノテーションには、なぜこのような影響が大きいのですか?なぜそれが基本的に私は、var宣言でCachingRepositoryインターフェイスを使用するように強制ですか?

は、私はシームに@ViewScopedなっCDIビュースコープのBeanを作成する3つのフェイスを使用して」、その手の問題はまだCDIのみの可能性があります。

+0

ああ、これはこれまでのところある程度答えられたようだ。http://stackoverflow.com/questions/9038815/weld-001408-unsatisfied-dependencies-when-injecting-ejbs-that-implement-interfac、しかしなぜ "あなたがEJBを使うのであれば、もう実装を使うことはできません"と言いましたか?これの背後にある論理は何ですか?それはもはやなぜできないのですか?このコンベンションは存在するようですが、なぜそれは全くですか? – Kawu

+0

私が書いたように、私はこれを感知していないし、もはやそれができないので喜んでいます。 –

+0

あなたが必要な場合にのみ '@ Named'が必要であることを知っていますか? CDIマネージドBeanのJSFアクセス?それは、修飾されたEL名を提供することです。** CDIマネージドBeanにはpojoを作成しません(beans.xmlによって 'done'されます)。 –

答えて

9

私は、あなたが無インタフェースビューが宣言せずにCachingRepositoryインタフェースのEJBメソッドを公開UserRepository@Statefulを追加することで...

をこの誤解を招くような例外を除いて同じ問題を抱えていました。 no interface viewを有効にするには@LocalBeanUserRepositoryを追加してください。 Beanクラスは、そのBeanクラスの定義を介して、または配備記述子でno-インタフェースビューを公開することを指定しなければならないEJB 3.1仕様、セクション4.9.8「セッションBeanの無インタフェースビュー」

を参照してください。次の規則が適用されます

  • ...
  • をBeanには、少なくとも1つの他のクライアントビューを公開している場合、豆 が、それは上の @LocalBean注釈によって無インタフェースビューを公開することを指定しますBeanクラス、またはデプロイメントの 記述子にあります。
  • ...

私はまた、無インタフェースビューの詳細は、this stackoverflowの回答を参照してください。

+0

ニース、ちょうど私が必要なもの、感謝! – Kawu

+1

私はEJBを持っていません。私はコード内のどこでも@Defaultアノテーションを使用していません。しかし、Wildfly起動時にはまだこの例外が発生しています。私は多くを検索しましたが、誰もがEJBについて話しています。 – Sujoy