Olá pessoal não sei se isso é um bug do vraptor no GAE ou algo similar .
Estou utilizando um controller que popula no construtor um atributo que é um objeto da sessão ;
quando o método utiliza um forward ou redirect ele lança a exception abaixo :
Caused by: br.com.caelum.vraptor.proxy.ProxyCreationException: Tried to instantiate type: class br.com.jslsolucoes.erbuss.site.controllers.EmpresaProdutoController 1 times, but none of the attempts worked. The exceptions are: [net.sf.cglib.core.CodeGenerationException: java.lang.NullPointerException-->null]
package br.com.jslsolucoes.erbuss.site.controllers;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.poi.util.IOUtils;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
import br.com.caelum.vraptor.view.Results;
import br.com.jslsolucoes.erbuss.site.annotations.Paginated;
import br.com.jslsolucoes.erbuss.site.daos.EmpresaAtividadeDao;
import br.com.jslsolucoes.erbuss.site.daos.EmpresaProdutoDao;
import br.com.jslsolucoes.erbuss.site.daos.EmpresaProdutoFotoDao;
import br.com.jslsolucoes.erbuss.site.daos.ProdutoDao;
import br.com.jslsolucoes.erbuss.site.models.Empresa;
import br.com.jslsolucoes.erbuss.site.models.EmpresaProduto;
import br.com.jslsolucoes.erbuss.site.models.EmpresaProdutoFoto;
import br.com.jslsolucoes.erbuss.site.util.view.VraptorViewUtil;
@Resource
@Path("produto")
public class EmpresaProdutoController {
private EmpresaProdutoDao daoEmpresaProduto;
private EmpresaProdutoFotoDao daoEmpresaProdutoFoto;
private Result result;
private HttpServletResponse response;
private ProdutoDao daoProduto;
private EmpresaAtividadeDao daoEmpresaAtividade;
private Empresa empresa;
public EmpresaProdutoController(Result result,
EmpresaProdutoDao daoEmpresaProduto,EmpresaProdutoFotoDao daoEmpresaProdutoFoto,
HttpServletResponse response,ProdutoDao daoProduto,EmpresaAtividadeDao daoEmpresaAtividade
,HttpSession session) {
this.result = result;
this.daoEmpresaProduto = daoEmpresaProduto;
this.daoEmpresaProdutoFoto = daoEmpresaProdutoFoto;
this.daoProduto = daoProduto;
this.daoEmpresaAtividade = daoEmpresaAtividade;
this.response = response;
//Esse trecho em específico causa a exception quanto algum método tem foward ou redirect.
this.empresa = (Empresa) session.getAttribute("usuario");
}
@Paginated
@Path("list")
public void list(boolean ajax) {
if (ajax) {
result.use(Results.json()).from(
daoEmpresaProduto.listAll(empresa, (Integer) result
.included().get("start"), (Integer) result
.included().get("resultsPerPage"))).include("produto").include("fotos").serialize();
} else {
this.result.include("totalResults", daoEmpresaProduto.count(empresa));
this.result.include("empresaProdutoList", daoEmpresaProduto.listAll(empresa,
(Integer) result.included().get("start"), (Integer) result
.included().get("resultsPerPage")));
this.result.include("empresa",empresa);
}
}
@Path("foto/{empresaProdutoFoto.id}/{width}/{height}")
public void foto(EmpresaProdutoFoto empresaProdutoFoto, Integer width, Integer height)
throws IOException, SQLException {
IOUtils.copy(this.daoEmpresaProdutoFoto.getPhoto(empresaProdutoFoto, width, height),response.getOutputStream());
result.use(Results.nothing());
}
public void validate(EmpresaProduto empresaProduto) {
VraptorViewUtil.putErrorInView(
daoEmpresaProduto.validate(empresaProduto), result);
}
@Path("pendencia")
public void pendencia() {
this.result.include("empresa",empresa);
}
@Path("form")
public void form() {
if(this.daoEmpresaAtividade.hasPendencia(empresa)) {
this.result.redirectTo(this).pendencia();
} else {
this.result.include("empresa",empresa);
this.result.include("produtoList", daoProduto
.listAllBySecaoList(this.daoEmpresaAtividade.listAll(empresa,
null, null)));
}
}
@Path("search")
public void search(String term) {
result.use(Results.json())
.from(daoEmpresaProduto.searchByString(empresa, term))
.include("produto").include("fotos").serialize();
}
public void delete(String ids) {
daoEmpresaProduto.deactive(ids);
result.use(Results.nothing());
}
@Path("edit/{empresaProduto.id}")
public void edit(EmpresaProduto empresaProduto) {
result.include("empresaProduto", daoEmpresaProduto.load(empresaProduto.getId()));
result.forwardTo(this).form();
}
@Post
public void saveOrUpdate(EmpresaProduto empresaProduto,List<UploadedFile> fotos) throws IOException {
List<InputStream> streams = null;
if(fotos!=null&&fotos.size()>0) {
streams = new ArrayList<InputStream>();
for(UploadedFile uploaded : fotos) {
streams.add(uploaded.getFile());
}
}
daoEmpresaProduto.saveOrUpdate(empresaProduto,streams);
result.redirectTo(this).list(false);
}
}
–
Eu resolvi de um modo menos elegante que é em cada começo de método receber da sessao o objeto , ai funcionou :
//Injeto session no construtor
private HttpSession session;
construtor(HttpSession session){
this.session = session;
}
//E em cada começo dos métodos eu chamo
Empresa empresa = this.session.getAtributte("usuario");
Seria isso um bug , ou realmente não posso popular direto no construtor um objeto de session ??