Boa tarde!
Estou tentando utilizar um ejb local mas não obtive sucesso.
Quando vou utilizar no método testar() do MB recebo um nullpointer.
managed bean:
import interfaces.Teste;
import javax.ejb.EJB;
import javax.faces.event.ActionEvent;
public class TesteMB
{
@EJB(name = "testeEJB", beanName = "testeEJB")
private Teste teste;
private String valorTeste;
public String getValorTeste()
{
return valorTeste;
}
public void testar(ActionEvent event)
{
this.valorTeste = this.teste.teste();
}
}
EJB:
package ejb;
import interfaces.Teste;
import javax.ejb.Local;
import javax.ejb.Stateless;
@Local(value = Teste.class)
@Stateless(name = "testeEJB", mappedName = "testeEJB")
public class TesteBean implements Teste
{
@Override
public String teste()
{
return "Funcionou";
}
}
Interface local:
package interfaces;
public interface Teste
{
String teste();
}
Acabei criando uma servlet de teste e funciona:
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Teste extends HttpServlet
{
@EJB(name = "testeEJB", beanName = "testeEJB")
interfaces.Teste teste;
/****/
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException
{
PrintWriter pw = arg1.getWriter();
pw.println("<HTML>");
pw.println("<TITLE>Olá Mundo!</TITLE>");
pw.println("<BODY>");
pw.println("Olá Web!");
pw.println("<B>" + this.teste.teste() + "</B>");
pw.println("</BODY>");
pw.println("</HTML>");
pw.flush();
}
}
Empacoto tudo num EAR e faço deploy no weblogic, se uso a servlet funciona mas se uso o projeto jsf não.
Não entendo o pq de não funciona, alguma idéia?
Obrigado.
Tente assim
Stateless(mappedName = "InterfaceLocal")
depois:
@EJB(name = "InterfaceLocal#br.com.yourapp.InterfaceLocal", beanName = "InterfaceLocal#br.com.yourapp.InterfaceLocal")
Felipe,
Testei o que você passou e gerou a seguinte exception:
<21/02/2011 08h40min25s BRT> <Error> <Deployer> <BEA-149231> <Unable to set the activation state to true for the application 'EARJSF'.
weblogic.application.ModuleException: Could not setup environment
at weblogic.servlet.internal.WebAppModule.activateContexts(WebAppModule.java:1499)
at weblogic.servlet.internal.WebAppModule.activate(WebAppModule.java:442)
at weblogic.application.internal.flow.ModuleStateDriver$2.next(ModuleStateDriver.java:375)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:41)
at weblogic.application.internal.flow.ModuleStateDriver.activate(ModuleStateDriver.java:95)
Truncated. see log file for complete stacktrace
Caused By: weblogic.deployment.EnvironmentException: [J2EE:160101]Error: The ejb-link 'testeEJB#interfaces.Teste' declared in the ejb-ref or ejb-local-ref 'testeEJB#interfaces.Teste' in the application module 'WJSF.war' could not be resolved. The target EJB for the ejb-ref could not be found. Please ensure the link is correct.
at weblogic.deployment.BaseEnvironmentBuilder.addEJBLinkRef(BaseEnvironmentBuilder.java:464)
at weblogic.deployment.EnvironmentBuilder.addEJBReferences(EnvironmentBuilder.java:485)
at weblogic.servlet.internal.CompEnv.activate(CompEnv.java:157)
at weblogic.servlet.internal.WebAppServletContext.activate(WebAppServletContext.java:3117)
at weblogic.servlet.internal.WebAppModule.activateContexts(WebAppModule.java:1497)
Truncated. see log file for complete stacktrace
>
Obrigado pela ajuda.
Camarada, esquece esse ‘testeEJB’ e coloca o nome da interface mais # mais a package e o nome da interface novamente.
http://www.guj.com.br/java/132452-lookup-de-ejb-local-no-weblogic-103
Se eu fizer um lookup do ejb local funciona.
Alterei como você indicou e continua não funcionando, não gera a exception anterior mas gera um nullpointer quando vou utilizar. Acho que o problema é outro e não a forma como estou fazendo, pois quando estava subindo o weblogic notei a seguinte mensagem:
21/02/2011 11:43:39 com.sun.faces.spi.InjectionProviderFactory getProviderInstance
SEVERE: JSF1030: The specified InjectionProvider implementation 'com.bea.faces.WeblogicInjectionProvider' cannot be loaded.
21/02/2011 11:43:39 com.sun.faces.spi.InjectionProviderFactory createInstance
INFO: JSF1048: PostConstruct/PreDestroy annotations present. ManagedBeans methods marked with these annotations will have said annotations processed.
Vou pesquisar.
Obrigado.
Felipe, consegui resolver.
Achei esse link e segundo um dos posts é recomendavel usar as bibliotecas compartilhadas (jsf) do Weblogic pra funcionar a injeção.
Não sei se você precisou fazer isso, mas assim funcionou corretamente.
Muito obrigado pela ajuda!
ainda não utilizei JSF nas minhas apps.
o Weblogic possui as shared libraries, sempre que vou utilizar algo que ele mesmo usa, é só referenciar na IDE.
valeu!