O JBoss Seam de fato é um framework que enche os olhos de qualquer um, mesmo tendo trabalhando em geradores de códigos/aplicações, me rendi ao JBoss Seam desde a primeira vez que o vi, mais precisamente no final de 2006, de lá pra cá, os projetos que trabalhei usavam muito mais questões de integrações do que aplicações de usuários finais. Porém, desde que comecei a avaliar o Seam com um maior cuidado para utilizá-lo como framework JSF por trás do Console do novo JBoss Profiler, percebi que realmente o framework vale muito a pena.Não é pra menos, um time de talentosos desenvolvedores está por trás do Seam, logo, tal resultado já era esperado. Mas chega de papo, e vamos a algumas dicas interessantes:
Forçando o Login para Determinadas Páginas JSF
Muitas vezes você quer que determinadas Páginas sejam protegidas por Login, para resolver isso, o Seam possui todo um framework de segurança baseado em JAAS, e para ativar tal requisito para uma determinada página, basta adicionar a seguinte string no arquivo pages.xml :
-
<page view-id="/travel*" login-required="true"/>
Adicionando novas Consultas baseadas na Extensão do EntityQuery
Quando você extende a classe EntityQuery você tem acesso a vários componentens que o Seam injeta dinamicamente para nós, entre eles o EntityManager do JPA, que pemite que criemos Queries dinamicas, veja no exemplo o método que adicionei em uma das classes que extende o EntityQuery:
-
-
return (Employee) this.getEntityManager().createQuery
-
("from Employee where email=:email")
-
.setParameter("email", email)
-
.getSingleResult();
-
-
}
Implementando uma Autenticação no Seam e salvando dados no Contexto
Imagine que seus dados de usuários serão buscados via JPA, o exemplo a seguir mostra o Autenticator em ação, que é um SessionBean que o Seam executa toda a vez que a Aplicação precisa autenticar alguém. O Autenticator é um recurso que também faz parte do Seam. (No exemplo abaixo não há encriptação de senha, por favor leve isso em consideração no mundo real):
-
{
-
@Logger Log log;
-
-
@In Identity identity;
-
-
@In FacesMessages facesMessages;
-
-
public boolean authenticate()
-
{
-
log.info("authenticating #0", identity.getUsername());
-
-
identity.addRole("admin");
-
-
Employee employee = new
-
EmployeeList().getUserByEmail
-
(identity.getUsername());
-
-
-
boolean ok = employee.getPassword().
-
equalsIgnoreCase(identity.getPassword());
-
-
if (ok) {
-
-
Contexts.getSessionContext().set("employee",
-
employee);
-
-
identity.addRole(employee.getPositionEmployee());
-
-
facesMessages.add
-
employee.getName()));
-
}
-
-
return ok;
-
-
}
-
}
EntityListeners nossos! E por que não?
Mesmo com o suporte a Inteceptors do Seam, não faz mal criarmos os nossos algumas vezes, eis então um exemplo de inteceptação de eventos
na EntityClass: TravelRequest, onde antes de persistirmos uma informação, podemos promover uma avaliação e tomar alguma ação antes da ação ser executada,
os famosos Eventos, presentes em frameworks de persistências muito antigos como o TFieldDataLink no Borland Delphi desde 1995. Veja o exemplo:
EntityListener:
-
import javax.persistence.PrePersist;
-
-
public class TravelRequestListener {
-
-
@PrePersist
-
public void beforePost(TravelRequest request) {
-
-
if (request.getStatus()!=null &&
-
request.getStatus().equalsIgnoreCase("")) {
-
-
request.setStatus("NEW");
-
-
}
-
}
-
-
}
Registro do EntityListener:
-
@EntityListeners({TravelRequestListener.class})
-
...

Entries (RSS)