2015-11-22 2 views
0

Я создал проект EJB с Eclipse IDE. Мой сервер приложений - Glassfish 4. И база данных, которую я использую, - это Oracle. Теперь, когда я запускаю код, я получил сообщение об ошибке:Проект EJB выбрасывает WELD-001408 Исключение: Неудовлетворенные зависимости

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 Касс:

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

} 
+0

Если вы используете guava, обновите до последней версии guava, используйте последнюю версию CDI (сварка), а в вашем beans.xml укажите '' 'bean-discovery-mode =" annotated "' '' – maress

+0

@maress, похоже, хороший момент. Набор идет от Guava, и есть эта знаменитая проблема с Guava и CDI, для которой был выпущен технический релиз спецификации CDI. Более подробную информацию о проблеме с guava можно найти здесь: https://code.google.com/p/guava-libraries/issues/detail?id=1433 – OndrejM

+0

Возможный дубликат [При добавлении зависимостей: сбой внедрения CDI, недопустимые зависимости для типа Set с квалификаторами @Default] (http://stackoverflow.com/questions/30956334/when-adding-dependency-cdi-deployment-failure-unsatisfied-dependencies-for-typ) –

ответ

0

Это маловероятно, что ваш код на самом деле имеет Set<Service>, определенный в нем, или по крайней мере, это предположение Я собираюсь сработать.

Эта ошибка неоднозначна. Однако, если вы можете предоставить полную информацию об исключении, которое вы получаете, а не останавливаться на qualifiers @Default at injection point, это поможет получить более четкое решение.

Мои предчувствия:

Вы упоминаете проект EJB, однако вы определяете зависимости от кода JSF (javax.faces) в вашем приложении. Glassfish не будет активировать JSF на EJB, развернутых напрямую.

Теперь, возможно, вы упомянули проект EJB, однако на самом деле вы развертываете WAR. Если это так, я бы проверял WAR на ненужные зависимости, которые были упакованы.

0

Я считаю, что вы используете Google Guava в своем проекте, поскольку @maress намекает на его комментарий. Есть 3 возможных решений:

  • понизить гуавы до версии 13, который, как сообщается, не имеет эту проблему
  • добавить this beans.xml файл внутри META-INF каталог внутри JAR-файл гуава
  • обновления Weld до версии 2.2 (или целая Glassfish до 4.1), которая реализует версию обслуживания CDI 1.2, что устраняет проблему с гуавы

фона:

Set<Services> исходит из гуавы. Гуава использует аннотации @Inject, плюс в этом конкретном случае он также использует аннотацию @Singleton. В CDI 1.1 (Java EE 7) бобы, аннотированные с @Singleton, автоматически рассматриваются как компоненты CDI, а когда CDI вычисляет зависимости для этого класса Guava, он не работает - подробнее здесь: code.google.com/p/guava-libraries/issues/detail? id = 1433

Добавление в файл guava jar файла beans.xml, который отключает CDI с bean-discovery=none, решает проблему, но только для Java EE 7 (с другой стороны, это создает проблемы со старым механизмом CDI, используемым в Java EE 6). Наконец, спецификация CDI 1.2 удалила аннотацию @Singleton из аннотаций, которая превращает классы в CDI beans, что также решает проблему с любой версией Guava.

Смежные вопросы