2 種類のリポジトリを管理する次のコードがあります。どちらのリポジトリ クラスも、リソースの再初期化を可能にするインターフェイスを継承します。
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;
}
...
}
これを(なしで@Stateful
)コンテキストに注入すると
@Named
@ViewScoped
public class MyHandler implements Serializable
{
@Inject
private UserRepository userRepo;
...
}
できます。ただし、クラスに追加@Stateful
するとUserRepository
、デプロイは失敗し、次の例外が発生します。
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
次のようにCDI Beanの名前を追加します
@Inject @Named("userRepo")
private UserRepository userRepo;
同じ例外が発生します。と組み合わせて機能する唯一のこと@Stateful
は、var 宣言でインターフェイスを使用することです。
@Inject @Named("userRepo")
private CachingRepository userRepo;
ただし、ここではサブクラス機能が必要になる可能性があるため、CachingRepository
(現時点では) 使用することはあまり望ましくありません。
Q :
- これが期待どおりに機能しないのはなぜですか? var は、
UserRepository
インスタンス化するクラスをすでに識別しているはずですよね? これの論理は何ですか? @Stateful
EJB アノテーションがここまで深刻な影響を与えるのはなぜでしょうか?CachingRepository
本質的に var 宣言でインターフェイスを使用する必要があるのはなぜですか?
私は Seam 3 Faces を使用して をCDI@ViewScoped
ビュースコープの Bean にすることに注意してください。