我有以下代码来管理两种存储库。两个存储库类都继承了一个接口,以允许重新初始化其资源。
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
并不是真正需要的(目前)。
问的:
UserRepository
var应该已经识别要实例化的类,不应该吗?这是什么逻辑?@Stateful
EJB注释在这里有如此严重的影响?为什么它本质上迫使我在var声明中使用CachingRepository
接口? 注意,我使用Seam 3 Faces使@ViewScoped
成为CDI视图范围的bean,因此手头的问题可能仍然仅限CDI
答案 0 :(得分:10)
我对这个误导性的例外有同样的问题......
通过向@Stateful
添加UserRepository
,您可以公开CachingRepository
接口的EJB方法,而无需声明无接口视图。将@LocalBean
添加到UserRepository
以激活无界面视图。请参阅EJB 3.1规范,第4.9.8节“会话Bean的无接口视图”
bean类必须指定它通过bean类定义或部署描述符公开无接口视图。以下规则适用:
- ...
- 如果bean暴露了至少一个其他客户端视图,那么bean 指定它通过以下方式公开无界面视图 bean类或部署中的@LocalBean批注 描述符。
- ...
我还会参考this stackoverflow答案,了解有关无界面视图的更多信息。
答案 1 :(得分:0)
我有同样的问题。
这就是我要解决的问题:
我必须使用下面的wildfly容器生成要尝试注入的EJB:
@ApplicationScoped
public class Resources {
private static final String DISCOUNT_SERVICE_ENDPOINT_PROPERTY =
"services.discount.endpoint";
private MyServiceImpl myService;
}
@Produces
public MyServiceImpl produceMyServiceImpl() {
if (myService == null) {
String endpoint = System.getProperty(DISCOUNT_SERVICE_ENDPOINT_PROPERTY);
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(MyServiceImpl.class);
factory.setServiceName(MyService.SERVICE);
factory.setAddress(endpoint);
myService = (MyServiceImpl) factory.create();
}
return myService;
}
下面是一个配置,位于您standalone-full.xml文件下。
<property name="services.discount.endpoint" value="http://localhost:8080/my_service/MyService/MyServiceImpl"/>
答案 2 :(得分:0)
我有同样的问题。我希望这可以帮助某人。
要解决此问题:
Properties
Project facets
Project facets
上,激活选项CDI 现在一切都很好。
答案 3 :(得分:0)
我有同样的错误。
由以下原因引起:org.jboss.weld.exceptions.DeploymentException:WELD-001408: 带限定符的UserTransaction类型的依赖关系未满足 @默认在注入点[BackedAnnotatedField] @Inject ...
我这样解决了这个问题: 收到错误时,我以这种方式使用UserTransaction。
@Inject
UserTransaction trans;
我使用@Inject
注释代替了@Resource
。
答案 4 :(得分:0)
也许您应该在bean类上添加非参数化的构造方法。 我在Jboss文档中读到说:具有没有参数的构造函数(或用@Inject注释指定的构造函数)的具体Java类是bean。