Mostrando postagens com marcador jsf. Mostrar todas as postagens
Mostrando postagens com marcador jsf. Mostrar todas as postagens

quarta-feira, 18 de julho de 2012

JSF - Página de erro após sessão expirada?

Eu estava pegando sempre uma página de erro após muito tempo de inatividade em uma aplicação JSF ou quando reiniciava o servidor e clicava em algum link na página.

Para resolver esse problema chato, usei as seguintes linhas no web.xml da aplicação.

<error-page>
    <exception-type>
        javax.faces.application.ViewExpiredException
    </exception-type>
    <location>
        /index.html
    </location>
</error-page>


Com essas linhas no web.xml a aplicação ao invés de exibir a página de erro quando a view estiver expirada, vai redirecionar o usuário para a página indicada.

JSF - URL não muda após redirect?

Em situações que um método retorna a url de redirect da sua página, como por exemplo:

public String listar() {
    return "/pages/list.xhtml";
}


E o JSF não muda a URL na barra do browser, recomendo a inclusão da seguinte string após a url:  + "?faces-redirect=true"

ficando:

public String listar() {
    return "/pages/list.xhtml"  + "?faces-redirect=true";
}


Fazendo isso, a URL sempre vai mudar. ;-)

domingo, 15 de abril de 2012

JSF 2.0 + Spring - Injeção de Dependência (DI)

Estou desenvolvendo uma aplicação utilizando JSF 2.0, Hibernate, Spring 3, etc...

No caso, procurei utilizar anotações e acabei cometendo um equívoco na escolha das anotações que a principio, não gerou problema, porém, quando testei multiplos acessos à aplicação, os problemas começaram a aparecer, como por exemplo, um usuário invalidando a sessão do outro.

O ponto é que eu estava usando a anotação @Component("nomeBean") nos beans gerenciados e @Autowired para fazer o trabalho de DI (anotações do Spring).

Pesquisando para resolver o problema, cheguei ao seguinte resultado:

- Ao invés de:
@Component("nomeBean")

- Use:
@ManagedBean(name="nomeBean")

- e ao invés de:
@Autowired

- Use:
@ManagedProperty(value="#{nomeBeanInjetar}")


Utilizarei como exemplo uma classe usuário recebendo a injeção de um UsuarioDAO.

- Implentação do UsuarioDAO que deverá ser injetado no objeto usuarioController, que é meu managed bean:

@Component("usuarioDAO")
public class UsuarioDAO implements IUsuarioDAO {
...

- Classe que receberá a injeção:

@ManagedBean(name="usuarioController")
@SessionScoped
public class UsuarioController {

@ManagedProperty(value="#{usuarioDAO}")
private IUsuarioDAO usuarioDao;

public void setUsuarioDAO(IUsuarioDAO usuarioDAO) {
this.usuarioDAO = usuarioDAO;
}
...


Note que na abordagem acima estou usando anotações do JSF (@ManagedBean e @ManagedProperty) e anotações do Spring.

A ideia é a seguinte:
- Criamos os objetos que serão reutilizados mais adiante sendo injetados em nossos managed beans, esses objetos devem ser marcados como componentes e nesse momento, devemos dar um nome a ele, nesse processo, o Spring vai criar este objeto em memória e deixá-lo pronto para ser injetado quando for chamado;
- O segundo passo é no nosso managed bean que devemos identificar a propriedade com a anotação @ManagedProperty e informar qual será o objeto que deverá ser injetado usando o mesmo nome dado anteriormente;

Bom, seguindo o padrão de posts rápidos e dirétos, basicamente foi isso que me ajudou bastante.

OBS.:
1. Quando utilizada a anotação @ManagedProperty, o atributo deve possuir um setter associado a ele, como no exemplo acima;

2. Quando ainda não tinha notado que o erro era este, procurei coisas estáticas na aplicação e por ai vai, então, fica a dica;

Espero ter ajudado e até a próxima.