Back-End

22 mai, 2014

Usando Spring com multiplos projects

Publicidade

Olá, pessoal!

O artigo hoje é bem rápido e a ideia é compartilhar com vocês um problema comum quando temos mais de um projeto com dependência e precisamos usar o applicationContext que está em outro projeto.  São coisas que a gente não decora e que normalmente faz uma vez a cada novo projeto e que certamente esquecemos com o passar do tempo. E se algum livro fala sobre o assunto, certamente nem damos atenção à esse detalhe, pois estamos ansiosos em querer meter a mão na massa.

Contexto

Recentemente tive que criar um projeto com module do maven. Veja a estrutura para ficar mais claro:

---parent
    ---core
    ---web
        --dependecy of core

Com o desenho simples acima, estou dizendo que tenho um projeto parent (pai) que tem dois filhos: core e web. E o filho web depende do projeto core.

No projeto core temos o back-end da aplicação, ou seja, regras de negócio e persistência vão estar nesse projeto. O projeto web vai cuidar do front-end. É nele que teremos o controller, os arquivos .html, xhtml, jsp, js etc.

Então, na prática o projeto web tem um .jar do projeto core:

<dependency>
			<groupId>com.handson.core</groupId>
			<artifactId>xxx-core</artifactId>
			<version>1.0.0</version>
		</dependency>

Até aqui tudo bem. Nenhum problema, certo?

Como falei, o projeto core tem o applicationContext do Spring, já que é lá que fazemos IoC, dizemos para o Spring cuidar da sessionFactory etc.

E qual o problema? Quando precisamos usar o ApplicationContext no web. Esse é o problema. O código a seguir não vai funcionar quando a aplicação subir:

@Controller
@Path("/user")
public class UserController {
	@Autowired
	@Qualifier("userServiceImpl")
	private UserService userService;
//código omitido 
}

Por que não vai funcionar? Porque o applicationContext está dentro de .jar de outro projeto e ao subir a aplicação precisamos dizer isso para web.xml. Uma forma simples e rápida (não é elegante) é criar um arquivo applicationContenxt em web e importar o que temos no applicationContenxt no projeto core. Portanto, crie um app-context.xml em resource do projeto web:

springprojectwebresource

E no arquivo app-context que está no projeto web, faça isso:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 
	<import resource="classpath*:/META-INF/app-context.xml"/>
	        
</beans>

Esse caminho acima é porque o arquivo no projeto core está assim:

springappcontextcore

 

Agora, no arquivo web.xml, no projeto xx-web, deixe assim:

springwebxml

Assim, ao subir a aplicação, o arquivo que está dentro do .jar do projeto core será carregado. E no import que fizemos anteriormente dissemos para importar esse arquivo para o contexto da aplicação web que está sendo carregada.

Pronto. Salve as alterações e execute mvn install. Suba a aplicação e se o Spring não conseguir fazer o @Autowired, ele irá reclamar logo que subir. Mas o esperado é que não tenha problemas.

Vou ficando por aqui… Espero que tenham gostado da dica de hoje!

Abraços!