私は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の:予想通り
- なぜこの作業ではないでしょうか?
UserRepository
varは、インスタンス化するクラスを既に識別しているはずです。これに対する論理は何ですか? @Stateful
EJBアノテーションには、なぜこのような影響が大きいのですか?なぜそれが基本的に私は、var宣言でCachingRepository
インターフェイスを使用するように強制ですか?
注は、私はシームに@ViewScoped
なっCDIビュースコープのBeanを作成する3つのフェイスを使用して」、その手の問題はまだCDIのみの可能性があります。
ああ、これはこれまでのところある程度答えられたようだ。http://stackoverflow.com/questions/9038815/weld-001408-unsatisfied-dependencies-when-injecting-ejbs-that-implement-interfac、しかしなぜ "あなたがEJBを使うのであれば、もう実装を使うことはできません"と言いましたか?これの背後にある論理は何ですか?それはもはやなぜできないのですか?このコンベンションは存在するようですが、なぜそれは全くですか? – Kawu
私が書いたように、私はこれを感知していないし、もはやそれができないので喜んでいます。 –
あなたが必要な場合にのみ '@ Named'が必要であることを知っていますか? CDIマネージドBeanのJSFアクセス?それは、修飾されたEL名を提供することです。** CDIマネージドBeanにはpojoを作成しません(beans.xmlによって 'done'されます)。 –