Struts/EJB

6 respostas
M

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:

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;
  }
}

6 Respostas

maior_abandonado
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:

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;
  }
}

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...

M

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…

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

M

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

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.

M

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

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.

JMan

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

JMan

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

Criado 30 de maio de 2011
Ultima resposta 31 de mai. de 2011
Respostas 6
Participantes 3