忽略 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 个档案的所有排列。

/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 应该告诉您,您缺少编译所需的依赖项。这可以节省您部署应用程序的时间。