Java EE的CDI没有按预期工作

时间:2017-11-07 18:47:41

标签: java cdi java-ee-7 glassfish-4

大家好我有以下代码尝试使用 CDI ' s @produces

import java.sql.Connection;
import javax.enterprise.inject.Produces;
public class ConnectionSupplier
{

    @Produces
    //@RequestScoped
    @Connect
    public Connection getConnection()
    {
        //get connection from datasource
    }
}

这是@connect限定符

//remove imports

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD})
public @interface Connect{}

在这里我们进行注射

import com.seta.history.db.entities.Day;
import java.sql.Connection;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

@RequestScoped
@Named("day")
public class DayController
{

    @Inject
    @Connect
    private Connection connection;
    public void save(Day day)
    {
        //do-save
    }
}

但是它提供了以下异常

Severe:   Exception during lifecycle processing 
org.glassfish.deployment.common.DeploymentException: CDI deployment                 
failure:WELD-001408: Unsatisfied dependencies for type Connection with     
qualifiers @Connect
at injection point [BackedAnnotatedField] @Inject @Connect private 
com.seta.history.db.controllers.DayController.connection
at 
com.seta.history.db.controllers.
     DayController.connection(DayController.java:0)

我正在使用 Java EE 7 + GlassFish 4.1.2

注意我们通常使用Glassfish和 CDI 并且工作正常

所以任何人都可以帮助并提前感谢

1 个答案:

答案 0 :(得分:3)

在CDI中> 1.0,如果您没有任何beans.xml,CDI只扫描带注释的类。所以CDI没有考虑你的ConnectionSupplier班级和制片人。

您有两种方法可以解决此问题:

  • 为您的ConnectionSupplier课程添加注释(例如使用@ApplicationScoped
  • 使用beans.xml添加bean-discovery-mode="all",告诉CDI扫描所有类。