7. Aplicação exemplo-04: rdvmedecins-pf-spring
7.1. A migração
Vamos agora portar a aplicação anterior para um ambiente Spring / Tomcat:
![]() |
Vamos basear-nos em duas aplicações já criadas. Vamos utilizar:
- as camadas [DAO] e [JPA] da versão 02 JSF / Spring,
- a camada [web] / Primefaces da versão 03 PF / EJB,
- os ficheiros de configuração do Spring da versão 02
Estamos aqui a repetir um trabalho semelhante ao que foi realizado para portar a aplicação JSF2 / EJB / Glassfish para um ambiente JSF2 / Spring Tomcat. Por isso, daremos menos explicações. Se necessário, o leitor pode consultar essa migração.
Colocamos todos os projetos necessários para a portabilidade numa nova pasta [rdvmedecins-pf-spring] [1]:
![]() |
- [mv-rdvmedecins-spring-dao-jpa]: as camadas [DAO] e [JPA] da versão 02 JSF / Spring,
- [mv-rdvmedecins-spring-metier]: a camada [métier] da versão 02 JSF / Spring,
- [mv-rdvmedecins-pf]: a camada [web] da versão 03 Primefaces / EJB,
- em [2], carregamo-las no NetBeans,
- em [3], as dependências do projeto web já não estão corretas:
- as dependências das camadas [DAO], [JPA] e [métier] têm de ser alteradas para passarem a referir-se aos projetos Spring;
- o servidor Glassfish fornecia as bibliotecas de JSF. Já não é esse o caso com o servidor Tomcat. Por isso, é necessário adicioná-las às dependências.
O projeto [web] evolui da seguinte forma:
![]() |
O ficheiro [pom.xml] da camada [web] tem agora as seguintes dependências:
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mv-rdvmedecins-spring-metier</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>3.3</version>
</dependency>
</dependencies>
Surgem erros. Estes devem-se às referências EJB da camada [web]. Analisemos primeiro o bean [Application]:
![]() |
Eliminamos todas as linhas com erros devido a pacotes em falta, renomeamos a interface [IMetierLocal] para [IMetier] (este é o seu nome na camada [métier] do Spring) e utilizamos o Spring para a instanciar:
package beans;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import rdvmedecins.metier.service.IMetier;
public class Application {
// camada de negócios
private IMetier metier;
// erros
private List<Erreur> erreurs = new ArrayList<Erreur>();
private Boolean erreur = false;
public Application() {
try {
// instanciação da camada [métier]
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config-metier-dao.xml");
metier = (IMetier) ctx.getBean("metier");
} catch (Throwable th) {
// regista-se o erro
erreur = true;
erreurs.add(new Erreur(th.getClass().getName(), th.getMessage()));
while (th.getCause() != null) {
th = th.getCause();
erreurs.add(new Erreur(th.getClass().getName(), th.getMessage()));
}
return;
}
}
// getters
public Boolean getErreur() {
return erreur;
}
public List<Erreur> getErreurs() {
return erreurs;
}
public IMetier getMetier() {
return metier;
}
}
- linhas 20-21: instanciação da camada [métier] a partir do ficheiro de configuração do Spring. Este ficheiro é o utilizado pelas camadas [métier] e [1]. Copiamo-lo para o projeto web [2]:
![]() |
- linhas 22-31: tratamos uma eventual exceção e guardamos a sua pilha.
Feito isto, o bean [Application] já não apresenta erros. Vejamos agora os beans [Form], [1] e [2]:
![]() |
Eliminamos todas as linhas com erros (importações e anotações) devido a pacotes em falta. Isto é suficiente para eliminar todos os erros [3].
![]() |
Além disso, é necessário adicionar ao código do bean [Form] o getter e o setter do campo
// bean Application
private Application application;
Algumas das anotações removidas nos beans [Application] e [Form] declaravam as classes como beans com um determinado âmbito. Agora, esta configuração é feita no seguinte ficheiro [faces-config.xml] [4]:
<?xml version='1.0' encoding='UTF-8'?>
<!-- =========== FULL CONFIGURATION FILE ================================== -->
<faces-config version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
<application>
<!-- o ficheiro de mensagens -->
<resource-bundle>
<base-name>
messages
</base-name>
<var>msg</var>
</resource-bundle>
<message-bundle>messages</message-bundle>
</application>
<!-- o bean applicationBean -->
<managed-bean>
<managed-bean-name>applicationBean</managed-bean-name>
<managed-bean-class>beans.Application</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
<!-- o bean do formulário -->
<managed-bean>
<managed-bean-name>form</managed-bean-name>
<managed-bean-class>beans.Form</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>application</property-name>
<value>#{applicationBean}</value>
</managed-property>
</managed-bean>
</faces-config>
Normalmente, a portabilidade está concluída. No entanto, ainda teremos alguns pormenores para resolver. Podemos tentar executar a aplicação web.
![]() |
Deixamos que o leitor teste esta nova aplicação. Podemos melhorá-la ligeiramente para lidar com o caso em que a inicialização do bean [Application] falhar. Sabemos que, nesse caso, os seguintes campos foram inicializados:
// erros
private List<Erreur> erreurs = new ArrayList<Erreur>();
private Boolean erreur = false;
Este caso pode ser previsto no método init do bean [Form]:
@PostConstruct
private void init() {
// A inicialização decorreu corretamente?
if (application.getErreur()) {
// recuperar a lista de erros
erreurs = application.getErreurs();
// a vista dos erros é apresentada
setForms(false, false, true);
}
// os médicos e os clientes são armazenados em cache
...
}
- linha 5: se o bean [Application] não tiver sido inicializado corretamente,
- linha 7: recupera-se a lista de erros,
- linha 9: e exibe-se a página de erro.
Assim, se pararmos o SGBD e o MySQL e reiniciarmos a aplicação, recebemos agora a seguinte página:

7.2. Conclusion
A migração da aplicação Primefaces / EJB / Glassfish para um ambiente Primefaces / Spring / Tomcat revelou-se simples. O problema de fuga de memória assinalado no estudo da aplicação JSF / Spring / Tomcat (parágrafo 4.3.5) persiste.
Este problema será resolvido da mesma forma.
7.3. Testes com o Eclipse
![]() |
Importamos os projetos Maven para o Eclipse [1]:
Executamos o projeto web [2].
![]() |
Selecionamos o servidor Tomcat [3]. A página inicial da aplicação é então apresentada no navegador interno do Eclipse [4].









