我的bean.xml看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1" bean-discovery-mode="annotated">
</beans>
我的服务(后端-EJB类型)如下:
import javax.inject.Inject;
import javax.transaction.Transactional;
@Default
@Transactional(Transactional.TxType.REQUIRED)
public class UserServiceImpl implements UserService {
@Inject
private UserDao userDao;
@Inject
private UserMapper mapper;
和带有@Named
的带注释的bean使用此(网络):
import javax.inject.Inject;
import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;
@ViewScoped
@Named("indexMBean")
public class IndexMBean extends AbstractViewBean {
@Inject
private UserService userService;
构建成功,但是部署给了我这个例外:
由以下原因引起:org.jboss.weld.exceptions.DeploymentException:WELD-001408:带限定符@Default的UserService类型的依赖关系未得到满足 在注入点[BackedAnnotatedField] @Inject私有hu.food.bean.IndexMBean.userService
如何为UserService设置默认注入?
日志显示:
2018-11-12 11:28:25,706错误[org.jboss.msc.service.fail](MSC服务线程1-2)MSC000001:无法启动服务jboss.deployment.unit。“ kaJava-ear- 0.0.1-SNAPSHOT.ear”。WeldStartService:服务jboss.deployment.unit中的org.jboss.msc.service.StartException。“ kaJava-ear-0.0.1-SNAPSHOT.ear”。WeldStartService:无法启动服务 在org.jboss.msc.service.ServiceControllerImpl $ StartTask.execute(ServiceControllerImpl.java:1728) 在org.jboss.msc.service.ServiceControllerImpl $ ControllerTask.run(ServiceControllerImpl.java:1556) 在org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) 在org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985) 在org.jboss.threads.EnhancedQueueExecutor $ ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487) 在org.jboss.threads.EnhancedQueueExecutor $ ThreadBody.run(EnhancedQueueExecutor.java:1378) 在java.lang.Thread.run(Thread.java:748) 由以下原因引起:org.jboss.weld.exceptions.DeploymentException:WELD-001408:带限定符@Default的UserService类型的依赖关系未得到满足 在注入点[BackedAnnotatedField] @Inject私有hu.food.bean.IndexMBean.userService 在hu.food.bean.IndexMBean.userService(IndexMBean.java:0)
答案 0 :(得分:3)
您将bean发现模式设置为带注释。因此将仅检测到带有范围类型注释的bean
bean-discovery-mode="annotated">
请为您的bean添加一个像@depend这样的作用域类型注释
@Default
@Transactional(Transactional.TxType.REQUIRED)
@Dependent
public class UserServiceImpl implements UserService {
http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#bean_defining_annotations说:
一组定义注释的bean包含:
- @ ApplicationScoped,@ SessionScoped,@ ConversationScoped和
@RequestScoped批注
所有其他常规作用域类型,
@Interceptor和@Decorator批注,
所有构造型注释(即带有注释的注释) @Stereotype)
和@Dependent范围注释。
答案 1 :(得分:1)
您在annotated
中使用beans.xml
发现模式,这意味着只有具有所谓的 Bean定义注释的bean被发现并注册为bean。请查阅CDI spec,以获取属于该注释的所有注释;对于您的用例,您缺少 bean范围。
如果您从@Default
中删除了UserServiceImpl
限定词(它没有用,无论如何都将其添加到其中; spec link)并为该bean添加一个作用域,它将起作用。
根据bean的行为方式(从生命周期的角度来看),可以使其变为@ApplicationScoped
,@SessionScoped
,@RequestScoped
,@ConversationScoped
,@Dependent
( ,@Singleton
)。