Struts/EJB

Pessoal,

Estou tendo problemas ao tentar fazer integração com Struts e EJB. Ocorre que, ao fazer o deploy do meu .war no servidor JBoss 4.2, subir a aplicação e tentar acessar uma action que chame um EJB injetado num campo, este campo está nulo!

Abaixo segue uma versão bem resumida do código:

[code]package com.app;

public interface MeuServico {
void facaAlgo();
}

public abstract class MeuServicoSupport implements MeuServico {
public void facaAlgo() {
}
}

@Local
public interface MeuServicoLocal {
}

@Stateless(name = “ejb/meu-servico”)
public class MeuServicoBean extends MeuServicoSupport implements MeuServicoLocal {
}

public abstract class MinhaActionSupport extends ActionSupport {
public String execute() {
getMeuServico().facaAlgo(); // Aqui, getMeuServico() retorna null. Ver implementação abaixo.
return SUCCESS;
}

protected abstract MeuServico getMeuServico();
}

public class MinhaActionImpl extends MinhaActionSupport {
@EJB(name = “ejb/meu-servico”)
private MeuServico meuServico;

protected MeuServico getMeuServico() {
return meuServico;
}
}[/code]

[quote=matheus.cruz]Pessoal,

Estou tendo problemas ao tentar fazer integração com Struts e EJB. Ocorre que, ao fazer o deploy do meu .war no servidor JBoss 4.2, subir a aplicação e tentar acessar uma action que chame um EJB injetado num campo, este campo está nulo!

Abaixo segue uma versão bem resumida do código:

[code]package com.app;

public interface MeuServico {
void facaAlgo();
}

public abstract class MeuServicoSupport implements MeuServico {
public void facaAlgo() {
}
}

@Local
public interface MeuServicoLocal {
}

@Stateless(name = “ejb/meu-servico”)
public class MeuServicoBean extends MeuServicoSupport implements MeuServicoLocal {
}

public abstract class MinhaActionSupport extends ActionSupport {
public String execute() {
getMeuServico().facaAlgo(); // Aqui, getMeuServico() retorna null. Ver implementação abaixo.
return SUCCESS;
}

protected abstract MeuServico getMeuServico();
}

public class MinhaActionImpl extends MinhaActionSupport {
@EJB(name = “ejb/meu-servico”)
private MeuServico meuServico;

protected MeuServico getMeuServico() {
return meuServico;
}
}[/code]

[/quote]

eu não tenho certeza mais… achoq que o jboss 4 não implementa toda a especificação do ejb 3.0, justamente essa anotação @EJB para injeção não funciona se não me engano…

outro detalhe também, é que você disse ter feito deploy de um arquivo .war, se sua aplicação contém EJBs, deveria ser um .ear, com o .war dentro dele e os ejbs em arquivos .jar também dentro do ear…

[quote=maior_abandonado]eu não tenho certeza mais… achoq que o jboss 4 não implementa toda a especificação do ejb 3.0, justamente essa anotação @EJB para injeção não funciona se não me engano…

outro detalhe também, é que você disse ter feito deploy de um arquivo .war, se sua aplicação contém EJBs, deveria ser um .ear, com o .war dentro dele e os ejbs em arquivos .jar também dentro do ear…[/quote]

Valeu a dica. Tentei outra abordagem mas sem sucesso. Segue anexo.

[quote=Maracuja]A anotacao @EJB so vai funcionar em

Em uma action vc pode usar Spring ou ate google guice para fazer isso para vc.

Exemplo usando Struts2 por exemplo.

Espero que ajude.

[]`s[/quote]

Cara, o link que tu passou parece ser bem interessante. Vou dar uma olhada em casa.

No entanto, ainda gostaria de saber como resolver o problema sem o uso de outras libs, nem que seja utilizando o InitialContext direto, conforme anexo que enviei na última citação.

[quote=Maracuja]Sim, se vc nao quer usar recurso injetado, e so fazer o lookup do seu EJB. Nesse caso, pode ser uma boa ideia usar o pattern ServiceLocator.

http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html

[]`s [/quote]

Enviei um anexo numa citação anterior contendo um .ear que tenta fazer o lookup do EJB. Não está exatamente igual ao código do link que tu mandou, mas acho que segue a ideia.

Mesmo assim não rolou.

A anotacao @EJB so vai funcionar em

Em uma action vc pode usar Spring ou ate google guice para fazer isso para vc.

Exemplo usando Struts2 por exemplo.

Espero que ajude.

[]`s

Sim, se vc nao quer usar recurso injetado, e so fazer o lookup do seu EJB. Nesse caso, pode ser uma boa ideia usar o pattern ServiceLocator.

http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html

[]`s