CDI Producermethod忽略了

时间:2016-01-13 08:05:22

标签: java jboss cdi wildfly jboss-weld

我完全不知所措!我有这个班级:

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个档案的每个排列。

  • 上述
  • beansinterfaces作为.war
  • 中的库
  • beans作为额外部署
  • beans作为额外部署AND在ear / lib

/ lib中的bean显然是通过焊接扫描的,因为String没有任何问题。

1 个答案:

答案 0 :(得分:0)

引自Weld文档2.2.3

  

生产者方法必须是托管bean 类或会话bean 类的非抽象方法。生产者方法可以是静态的也可以是非静态的。如果bean是会话bean,那么producer方法必须是EJB的业务方法或bean类的静态方法。

因此,您可以使用ResourceProducer@ApplicationScoped添加注释。

注意:使用任何现代IDE应该告诉您,您缺少编译时所需的依赖项。这样可以节省部署应用程序的时间。