Olá a todos, me deparei com uma dúvida ontem que fiquei sem solução, primeiro explicarei meu problema:
A JORNADA ATÉ O PROBLEMA
Estou utilizando JSF + Primefaces e fiquei surpreso com a quantidade de coisas que o primefaces me ajuda, a exemplo dos gráficos. Na aplicação que estou desenvolvendo temos MUITOS gráficos e alguns deles tem que ser atualizados em tempo de execução. Para a maioria dos gráficos isso é tranquilo o Primefaces ajuda, mas o PRINCIPAL gráfico é um gráfico de Gantt e esse o prime não possue, pra tanto preciso de outro framework.
Pesquisa na net encontrei o JFreeChart que é bem interessante mas pro meu caso é uma complicação, já que o gráfico será atualizado a cada item incluído (via ajax) ou excluído. O JFreeChart gera o gráfico como uma imagem (PNG, GIF, JPEG) e exibe na tela como stream. Imagina como seria, a medida que a pessoa adiciona um item ela precisa acompanhar essa mudança no gráfico e não pode ficar esperando baixar uma imagem sempre que fizer uma mudança.
Resolvi ir atrás de uma solução JQuery. Encontrei uma muito boa, mas eu fiquei sem saber como atualizar o meu gráfico JQuery com as informações que tenho me sessão no bean, foi quando eu vi que ele aceitava JSON, resolvi fazer um método dentro de meu bean que retornasse o objeto que está em sessão no formato JSON, para a página ler os dados e criar o gráfico.
O PROBLEMA
Quando eu tento usar o objeto em sessão, percebo que ele está vazio, foi quando percebi: apesar do método rest estar dentro do mesmo bean que utilizo na aplicação, eles não compartilham a mesma classe. É como se eu tivesse um bean que utilizo normalmente e quando a aplicação faz a solicitação REST, o servidor instanciasse outra classe bean com tudo vazio (como se nunca tivesse sido usada).
UMA PARTE DO BEAN
@ManagedBean
@SessionScoped
@Path("/termoAbertura")
public class TermoAberturaBean {
private Projeto projeto = new Projeto();
private Etapa etapa = new Etapa();
private Restricao restricao = new Restricao();
public List<Categoria> getAllCategorias(){
List<Categoria> categorias = new ArrayList<Categoria>();
categorias.add(Categoria.PEQUENO);
categorias.add(Categoria.MEDIO);
categorias.add(Categoria.GRANDE);
return categorias;
}
public List<TipoRestricao> getAllTipoRestricao(){
List<TipoRestricao> tipos = new ArrayList<TipoRestricao>();
tipos.add(TipoRestricao.PREMISSA);
tipos.add(TipoRestricao.RESTRICAO);
return tipos;
}
@GET
@Path("etapasGantt")
@Produces("application/json")
public List<Gantt> etapasGantt(){
List<Gantt> lista = new ArrayList<Gantt>();
Gantt gantt;
gantt = new Gantt();
gantt.setName(projeto.getNome());
GanttValues values = new GanttValues();
values.setLabel(projeto.getNome());
values.setFrom(projeto.getInicioDesejado());
values.setTo(projeto.getTerminoDesejado());
gantt.addValues(values);
lista.add(gantt);
for (Etapa etapa : projeto.getEtapas()){
gantt = new Gantt();
gantt.setName(etapa.getDescricao());
values = new GanttValues();
values.setLabel(etapa.getDescricao());
values.setFrom(etapa.getInicio());
values.setTo(etapa.getTermino());
gantt.addValues(values);
lista.add(gantt);
}
return lista;
}
EXPLICANDO O CÓDIGO
Esse objeto “projeto” já está populado no momento que a aplicação chama o método etapasGantt(), mas mesmo assim ela enxerga todos os objetos como se tivessem acabado de ser instanciado
COMO FAÇO PRA RESOLVER ESSE PROBLEMA?