Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Integrando o Spring com o EJB

bom dia a todos, aqui na empresa que trabalho sempre utilizamos ejb, vou criar uma parte externa de um sistema e essa parte externa do sistema estava pensando em fazer em SpringMVC, mas a parte que eu costumo chamar de server(entidades+ stateless sessions beans) já estão prontos e não valeria a pena refazer e não encontrei nada na internet de como fazer essa integração dos stateless sessions beans no controller do spring via anotação, apenas em xml. Como posso injetar meus ejbs nos meus controllers via anotação?

@Local
public interface CadastroService{

public void cadastrar(Cliente cliente);
}
@Stateless
public interface CadastroServiceImpl implements CadastroService{

@PersistenceContext
private  EntityManager em;

public void cadastrar(Cliente cliente){ em.persist(cliente);}
}
@Controller
public interface CadastroController{

@AutoWired
private CadastroService service;

}
5 respostas

Oi Ricardo,

para a injeção do EJB funcionar no Spring Bean vc precisa configurar o lookup no XML do Spring.

Vc está usando qual servidor de aplicação?

abs

Olá Nico, estou usando Jboss7, ainda não existe essa configuração de ejb via anotação?

O problema é que anotação não basta pois o Spring precisa fazer o lookup dos EJB no registro JNDI do servidor de aplicação.

Aquele nomes dos EJBs no JNDI, como também as configurações inicias do registro JNDI, são totalmente específicos de cada servidor JavaEE, até mudam entre versões do JBoss/Wildfly.

Quando vc usa @EJB/@Inject para injetar um EJB dentro do outro, o container EJB já está configurado para conhecer o JNDI dele. O Spring Container é um container separado, independente do servidor de aplicação e não tem esse conhecimento.

Agora temos que caçar essa configuração!

abs

solução!

Oi Ricardo, tudo bem?

Você pode criar um método com @Bean e fazer o lookup dentro dele:

@Bean
public Estoque estoque() { 
    InitialContext context = new InitialContext();
    return (Estoque) context.lookup("...");        
}

E no Controller:

@Controller
public class MeuController {

    @Autowired
    private Estoque estoque;
}

Beleza? Abraços!

Oi Nico, consultando a documentação do Spring(http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/) ele recomenda fazer uma configuração, não deixa bem claro onde mas acredito ser no applicationContext.xml

<jee:local-slsb id="myComponent" jndi-name="ejb/myBean"
        business-interface="com.mycom.MyComponent"/>

<bean id="myController" class="com.mycom.myController">
    <property name="myComponent" ref="myComponent"/>
</bean>

mas acontece que já estou usando a configuração programática, posso mesclar os dois tipos de configuração? xml e anotação?

Oi Leonardo, eu tava querendo fugir de fazer esse lookup que acho horrível, mas certamente essa solução vai funcionar.

Só uma pergunta, nessa solução , não tem problema se eu declarar o InitialContext como um bean do Spring? ou para cada bean que fizer lookup deve ter seu proprio initialContext?

@Bean
public InitialContext getInitialContext() throws namingException{

return new InitialContext();
}

@Bean
public MyService myService(){
return (MySercice)ctx.lookup("global:blablabla/MyServiceImpl")
}