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



我已经用Eclipse IDE创建了一个EJB项目。我的应用程序服务器是Glassfish 4。我使用的数据库是Oracle。现在,当我运行代码时,我得到了错误消息:

org.joss.weld.exceptions.DeploymentException:weld-001408:类型Set的依赖项不满足<服务>带有限定符@默认在注射点

看看下面的代码。

客户

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;
    }
}

您的代码中不太可能真正定义了Set<Service>,或者至少这是我要处理的假设。

此错误不明确。但是,如果您能够提供收到的异常的全部详细信息,而不是停留在qualifiers @Default at injection point,这将有助于获得更清晰的解决方案。

我的预感:

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

现在,您可能提到了EJB项目,但实际上您正在部署一个WAR。如果是这样的话,我会检查WAR中是否有不必要的依赖项被打包。

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

  • 将Guava降级到版本13,据报道该版本没有此问题
  • 将beans.xml文件添加到Guava的JAR文件中的META-INF目录中
  • 将Weld升级到2.2版(或将整个Glassfish升级到4.1版),它实现了CDI1.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/issues/detail?id=1433

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

相关内容

  • 没有找到相关文章

最新更新