忽略 CDI Producer 方法
CDI Producermethod ignored
我完全不知所措!我有这个 Class:
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;
}
};
}
}
并且,简单地放置字符串一个有效,另一个被容器忽略(Wildfly 9 / Weld)。
一开始我想注入一个 EJB 并且 getRemoteRepository
没有被注释为 @Named,因为我只知道为接口 Repository
提供一个生产者。收到错误后,我将它们更改为相同的,以限制错误的范围,即使在注入点中也是如此:
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
我没有得到字符串的这个异常!
此外,如果我用 @ApplicationScoped
注释 ResourceProducer
- 使其成为一个 Bean - 我希望得到不明确的绑定 - 因为我的 Producer 现在是通过 @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
作为附加部署并在 ear/lib
/lib 中的 bean 显然会被 weld 扫描,因为 String 没有任何问题。
引用自焊接文档2.2.3
A producer method must be a non-abstract method of a managed bean class or session bean class. A producer method may be either static or non-static. If the bean is a session bean, the producer method must be either a business method of the EJB or a static method of the bean class.
所以你可以用 @ApplicationScoped
注释你的 ResourceProducer
。
注意:使用任何现代 IDE 应该告诉您,您缺少编译所需的依赖项。这可以节省您部署应用程序的时间。
我完全不知所措!我有这个 Class:
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;
}
};
}
}
并且,简单地放置字符串一个有效,另一个被容器忽略(Wildfly 9 / Weld)。
一开始我想注入一个 EJB 并且 getRemoteRepository
没有被注释为 @Named,因为我只知道为接口 Repository
提供一个生产者。收到错误后,我将它们更改为相同的,以限制错误的范围,即使在注入点中也是如此:
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
我没有得到字符串的这个异常!
此外,如果我用 @ApplicationScoped
注释 ResourceProducer
- 使其成为一个 Bean - 我希望得到不明确的绑定 - 因为我的 Producer 现在是通过 @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
作为附加部署并在 ear/lib
/lib 中的 bean 显然会被 weld 扫描,因为 String 没有任何问题。
引用自焊接文档2.2.3
A producer method must be a non-abstract method of a managed bean class or session bean class. A producer method may be either static or non-static. If the bean is a session bean, the producer method must be either a business method of the EJB or a static method of the bean class.
所以你可以用 @ApplicationScoped
注释你的 ResourceProducer
。
注意:使用任何现代 IDE 应该告诉您,您缺少编译所需的依赖项。这可以节省您部署应用程序的时间。