将EJB服务注入Web的不令人满意的依赖关系(战争)

时间:2018-11-12 10:20:15

标签: ejb cdi

我的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)

2 个答案:

答案 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)。