EJB项目抛出WELD-001408异常:不满意的依赖项

时间:2015-11-22 14:57:10

标签: jsf java-ee ejb cdi

我使用Eclipse IDE创建了一个EJB项目。我的Application Server是Glassfish 4.我使用的数据库是Oracle。现在当我运行代码时,我收到了错误消息:

  

org.jboss.weld.exceptions.DeploymentException:WELD-001408:类型Set< Service>类型的不满意依赖项与限定词@Default         在注射点

请查看下面的代码。

客户

package de.java2enterprise.onlineshop.ejb;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Customer implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String email;
    private String password;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

RegisterBean

package de.java2enterprise.onlineshop.ejb;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class RegisterBean implements RegisterBeanRemote, RegisterBeanLocal {

    @PersistenceContext
    private EntityManager em;

    public RegisterBean() {
    }

    @Override
    public String persist(String email, String password) {
        Customer customer = new Customer();
        customer.setEmail(email);
        customer.setPassword(password);
        em.persist(customer);
        return email + " persisted";
    }
}

RegisterBeanLocal

package de.java2enterprise.onlineshop.ejb;

import javax.ejb.Local;

@Local
public interface RegisterBeanLocal {
    public abstract String persist(
            String email,
            String password);
}

RegisterBeanRemote

package de.java2enterprise.onlineshop.ejb;

import javax.ejb.Remote;

@Remote
public interface RegisterBeanRemote {
    public abstract String persist(
            String email,
            String password);
}

最后一个是我的 RegisterController ,它注入RegisterBeanLocal cass:

package de.onlineshop_web.bean;

import java.io.Serializable;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;

import de.java2enterprise.onlineshop.ejb.RegisterBeanLocal;

@Named
@RequestScoped
public class RegisterController implements Serializable {

    private static final long serialVersionUID = 1L;

    private String email;
    private String password;

    @EJB
    private RegisterBeanLocal registerBeanLocal;

    public String persist() {
        String msg = registerBeanLocal.persist(email, password);
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(msg));
        return "register";
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

2 个答案:

答案 0 :(得分:0)

你的代码不太可能在其中定义Set<Service>,或者至少是我将要解决的假设。

此错误不明确。但是,如果您可以提供所收到的例外的完整详细信息,而不是停留在qualifiers @Default at injection point,则有助于获得更清晰的解决方案。

我的预感:

您提到了一个EJB项目,但是您在应用程序中定义了对JSF代码(javax.faces)的依赖关系。 Glassfish不会在直接部署的EJB上激活JSF。

现在,可能是您提到了EJB项目,但实际上您正在部署WAR。如果是这种情况,我会检查WAR是否打包了不必要的依赖项。

答案 1 :(得分:0)

我相信您在项目中使用Google Guava,正如@maress在他的评论中暗示的那样。有三种可能的解决方案:

  • 将Guava降级到版本13,据报道没有此问题
  • 在{Guava
  • 的JAR文件中的META-INF目录中添加this beans.xml文件
  • 升级焊接到版本2.2(或整个Glassfish到4.1),它实现了CDI 1.2的维护版本,修复了Guava的问题

<强>背景

Set<Services>来自番石榴。 Guava使用@Inject注释,在此特定情况下,它还使用注释@Singleton。在CDI 1.1(Java EE 7)中,使用@Singleton注释的bean被自动视为CDI bean,当CDI计算此Guava类的依赖关系时,它会失败 - 更多详细信息:code.google.com/p/guava -libraries /问题/细节?ID = 1433

添加到guava jar文件中,使用bean-discovery=none禁用CDI的beans.xml解决了这个问题,但仅针对Java EE 7(另一方面,它使Java EE 6中使用的旧CDI机制出现问题)。最后,CDI规范1.2从注释中删除了注释@Singleton,它将类转换为CDI bean,这也解决了任何版本的Guava的问题。