我完全不知所措!我有这个班级:
package com.company.resources
import com.company.transport.Repository; //an interface for an EJB
import com.company.transport.Expression; //a simple DTO, returned by the Interface
public class ResourceProducer
{
//@EJB(lookup="foo") Repository repo;
@Produces @Named("archive")
public String getArchiveString() {
return "archive";
}
@Produces @Named("repository")
public Repository getRemoteRepository(){
//return repo;
return new Repository(){
@Override
public Expression getExpression(String s, Long aLong) {
return null;
}
};
}
}
而且,简单地将String一个工作,另一个被容器忽略(Wildfly 9 / Weld)。
一开始我想注入一个EJB,而getRemoteRepository
没有注释为@Named,因为我只知道为接口Repository
提供一个Producer。得到错误,我改变它们是相同的,以限制错误的范围,即使在注入点:
package com.company.resources
public Class ExpressionProxy {
@Inject @Named("archive") String target;
@Inject @Named("repository") Repositroy repo;
}
我明白了:
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type Repository with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject com.company.resources.ExpressionProxy
我没有得到字符串的这个例外!
另外,如果我使用ResourceProducer
注释@ApplicationScoped
- 使其成为Bean - 我希望得到不明确的绑定 - 因为我的制作人现在是通过@Produces
注释本身找到的并且存在于一个受管Bean。
我也只能获得字符串的异常绑定异常,永远不会出现Repository
我将两个班级都移到了一个.war和同一个包裹中 - 它根本不适用于Repository
。
之前我通过接口进行了CDI注入 - 这里有什么问题?
编辑:完全披露:
我将其部署在耳中,作为一个库:
app.ear/
-jaxrs.war # contains rest interface, irrelevant for this bug
-lib/
-beans.jar #contains the Producer and ExpressionProxy
-RepositoryInterface.jar # containts Repository and Expression
我尝试了所涉及的3个档案的每个排列。
beans
和interfaces
作为.war beans
作为额外部署beans
作为额外部署AND在ear / lib / lib中的bean显然是通过焊接扫描的,因为String没有任何问题。
答案 0 :(得分:0)
引自Weld文档2.2.3
生产者方法必须是托管bean 类或会话bean 类的非抽象方法。生产者方法可以是静态的也可以是非静态的。如果bean是会话bean,那么producer方法必须是EJB的业务方法或bean类的静态方法。
因此,您可以使用ResourceProducer
为@ApplicationScoped
添加注释。
注意:使用任何现代IDE应该告诉您,您缺少编译时所需的依赖项。这样可以节省部署应用程序的时间。