2016-06-07 2 views
3

У меня есть простой случай, когда у меня есть служба REST MyService, которая должна быть введена фасолью beanB типа BeanB, которая реализует интерфейс BeanBInterface. Я получаю ошибку классический WELD-001408 один показано ниже:Java EE bean с интерфейсом, который не создается для инъекций

org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type BeanBInterface with qualifiers @BeanBQualifier 
    at injection point [BackedAnnotatedField] @Inject @BeanBQualifier public com.example.MyService.beanB 
    at com.example.MyService.beanB(MyService.java:0) 

The Rest Service:

import javax.ws.rs.Path; 
import javax.inject.Inject; 

@Path("/") 
public class MyService { 
    @Inject 
    @BeanBQualifier(BeanBQualifier.Type.PROD) 
    public BeanBInterface beanB; 

    public MyService() {} 
} 

Bean Интерфейс:

public interface BeanBInterface { 
} 

Bean Реализация:

import javax.ejb.Singleton; 
import javax.ejb.Startup; 
import javax.enterprise.inject.Produces; 

@Startup 
@Singleton 
@BeanBQualifier(BeanBQualifier.Type.PROD) 
public class BeanB implements BeanBInterface { 
    private String name = "B"; 

    public BeanB() {} 

    public String getName() {return name;} 

    public void setName(String name) {this.name = name;} 
} 

Бин Классификатор

import javax.inject.Qualifier; 
import java.lang.annotation.Retention; 
import java.lang.annotation.Target; 
import static java.lang.annotation.ElementType.FIELD; 
import static java.lang.annotation.ElementType.TYPE; 
import static java.lang.annotation.RetentionPolicy.RUNTIME; 

@Qualifier 
@Retention(RUNTIME) 
@Target({FIELD, TYPE}) 
public @interface BeanBQualifier { 
    Type value(); 
    enum Type{PROD, TEST} 
} 

beans.xml (пробовали в META-INF/beans.xml, а также пытались в WEB-INF/beans.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" 

    bean-discovery-mode="annotated"> 
</beans> 

Я также попробовал bean-discovery-mode="all" с не повезло.

Если я декларирование beanB использовать конкретный класс BeanB, а не его интерфейс в MyService он работает (но это побеждает цель интерфейса):

Если добавить метод @Produces фабричный MyService к построить боб также работает, но это поражение цели позволить контейнер инстанцирует мои бобы для меня:

@javax.enterprise.inject.Produces 
public static BeanB get() { 
    return new BeanB(); 
} 

но если этот метод фабрики @Produces возвращает интерфейс вместо этого он не будет работать:

@javax.enterprise.inject.Produces 
public static BeanBInterface get() { 
    return new BeanB(); 
} 
+0

Будет полное имя '' '@ Singleton''' аннотацию? убедитесь, что это '' 'javax.ejb.Singleton''', а не' '' javax.faces.bean.Singleton''' – maress

+0

Да, я использую 'javax.ejb.Singleton' –

ответ

2

У EJB есть некоторые странные правила о том, какие интерфейсы фактически отображаются как реализованные. Отображаются только интерфейсы, отмеченные как @ Local/@ Remote. Если вы хотите использовать bean-компонент с интерфейсом и с классом, вам нужно добавить @LocalBean в ejb.

Короче: добавить @LOCAL к интерфейсу или @LOCAL (BeanBInterface.class) для BeanB

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