Projeto EJB não reconhece métodos com @Produces

2 respostas
java
C

Criei um projeto EJB 3.2 para rodar no wildfly 9 com intuito de usar o recurso de Timer. Depois do projeto pronto, precisei criar um Produtor (@Produces) para uma classe qualquer. Estranhamente o método com esta anotação @Produces não chega nem a ser executado e o deploy começa a falhar. Em tempo de desenvolvimento o eclipse dá Waring no @Inject com a seguinte mensagem:
No bean is eligible for injection to the injection point [JSR-346 §5.2.2]

Exemplo de Código:

#Classe onde será feita a injeção

@Stateless
public class Servico {
        @Inject 
	QualquerInterface q;
        
         public void teste(){
             q.teste();
        }
}

#Produtor

public class Produtor {	
	
	@Produces
	public QualquerInterface produz(){
		System.out.println("Passei no produtor");
		return new Qualquer();  
	}
}

#Classe que quero construir a partir do método Produtor

public class Qualquer implements QualquerInterface {

	@Override
	public void teste(){
		System.out.println("Qualquer teste");
	}
}

Segue meu POM.

UTF-8
<!-- JBoss dependency versions -->
    <version.wildfly.maven.plugin>1.0.2.Final</version.wildfly.maven.plugin>

    <!-- Define the version of the JBoss BOMs we want to import to specify tested stacks. -->
    <version.jboss.bom>8.2.1.Final</version.jboss.bom>

    <!-- other plugin versions -->
    <version.compiler.plugin>3.1</version.compiler.plugin>

    <!-- maven-compiler-plugin -->
    <maven.compiler.target>1.7</maven.compiler.target>
    <maven.compiler.source>1.7</maven.compiler.source>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.wildfly.bom</groupId>
            <artifactId>jboss-javaee-7.0-with-tools</artifactId>
            <version>${version.jboss.bom}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.wildfly.bom</groupId>
            <artifactId>jboss-javaee-7.0-with-hibernate</artifactId>
            <version>${version.jboss.bom}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
javax.enterprise cdi-api provided
<!-- Import the Common Annotations API (JSR-250), we use provided scope as the API is included in JBoss WildFly -->
    <dependency>
        <groupId>org.jboss.spec.javax.annotation</groupId>
        <artifactId>jboss-annotations-api_1.2_spec</artifactId>
        <scope>provided</scope>
    </dependency>
    
    <!-- Import the JPA API, we use provided scope as the API is included in JBoss WildFly -->
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.1-api</artifactId>
        <scope>provided</scope>
    </dependency>

    <!-- Import the EJB API, we use provided scope as the API is included in JBoss WildFly -->
    <dependency>
        <groupId>org.jboss.spec.javax.ejb</groupId>
        <artifactId>jboss-ejb-api_3.2_spec</artifactId>
        <scope>provided</scope>
    </dependency>

Você poderia por gentileza me ajudar ?

2 Respostas

D

aonde você faz o @inject coloca também @Named(“produz”) e me diz se funciona… se funcionar quer dizer que a múltiplas implementações dessa mesma interface no sistema.

C

Obrigado @darklordkamui, mas não é isso… Pois é uma aplicação de teste não há chance de haver outra implementação…

Eu descobri o que estava ocorrendo…

A Classe que possui os métodos produtores, também precisa ser um Bean.

Eu anotei a Classe Produtor como @Dependent.
Com isso tanto o warning quanto o Deploy passaram a funcionar, além claro, o produtor começou a ser invocado.

Vale Ressaltar que meu Bean.xml está como discovery = annoted, logo ele não colocava minha classe produtora
no contexto do CDI quando não estava com a anotação@Dependent.

Obrigado!!!

Criado 22 de novembro de 2016
Ultima resposta 22 de nov. de 2016
Respostas 2
Participantes 2