Java EE 的 CDI 没有按预期工作
Java EE's CDI doesn't work as expected
大家好,我有以下代码尝试使用 CDI 的 @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 并且效果很好
谁能帮忙提前致谢
在 CDI > 1.0 中,如果您没有任何 beans.xml,CDI 仅扫描带注释的 classes。所以CDI没有考虑到你的ConnectionSupplier
class和生产者
您有两种方法可以更正此问题:
- 注释您的
ConnectionSupplier
class(例如使用 @ApplicationScoped
)
- 添加
beans.xml
和 bean-discovery-mode="all"
告诉 CDI 扫描所有 classes。
大家好,我有以下代码尝试使用 CDI 的 @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 并且效果很好
谁能帮忙提前致谢
在 CDI > 1.0 中,如果您没有任何 beans.xml,CDI 仅扫描带注释的 classes。所以CDI没有考虑到你的ConnectionSupplier
class和生产者
您有两种方法可以更正此问题:
- 注释您的
ConnectionSupplier
class(例如使用@ApplicationScoped
) - 添加
beans.xml
和bean-discovery-mode="all"
告诉 CDI 扫描所有 classes。