2016-11-17 10 views
0

Я использую wildfly 10.1.0 и JavaEE 7Инъекционного EJB через интерфейс в приложении Wildfly

У меня этот интерфейс:

public interface TestEjb { 
    String something(); 
} 

и этот класс, реализующий компонент EJB его:

@LocalBean 
@Stateless 
public class TestEjbImpl implements TestEjb { 

    @Override 
    public String something() { 
     return "Hello world"; 
    } 
} 

Когда я ввожу его в класс @ ja-аннотированного jax-rs, используя

@Inject 
private TestEjb testEjb; 

Это дает ошибку говоря "WELD-001408: Невыполненные зависимости для типа TestEjb с отборочными @default"

Но когда я впрыснуть его как

@Inject 
private TestEjbImpl testEjb; 

он работает отлично. И удивительно, что оба способа работают без проблем в jboss-eap-6.4. Но почему?

ответ

1

Прежде всего, вы смешиваете инъекцию CDI с инъекцией EJB. Скорее используйте @EJB (вместо @Inject) при инъекции EJB.

@LocalBean имеет вид без интерфейса. Таким образом, у вас есть интерфейс без аннотации вида и компонента с аннотацией без интерфейса. Контейнер EJB понимает это как отсутствие интерфейса.

Лучший способ будет аннотировать интерфейс TestEjb с @Local зрения и удалить @LocalBean из TestEjbImpl реализации для того, чтобы ваше решение работать.

Интерфейс

@Local 
public interface TestEjb { 
    String something(); 
} 

EJB

@Stateless 
public class TestEjbImpl implements TestEjb { 

    @Override 
    public String something() { 
     return "Hello world"; 
    } 
} 

Время впрыска

@EJB 
private TestEjb testEjb; 

Я надеюсь, что это помогает.

Further reading ...

+0

Спасибо! Это помогло. Но я хотел бы изучить этот вопрос больше. И почему вы думаете, что это отлично работает в JBoss 6.4 и не в Wildfly 10? –

+0

Wildlfly 10 совместим с Java EE 7. Я не знаю, что означает JBoss 6.4. –

+0

Да, я сделал это. Благодарю. Я имею в виду JBoss 6.4: jboss-eap-6.4 –