Estou utilizando o vraptor 3.3.1 em meu primeiro contato com o GAE.
Preciso de uma interface para fazer upload de arquivos e segundo a documentação do GAE tenho que utilizar um serviço de blob deles o BlobstoreService. Segui conforme manda a documentação o único problema é que minha entidade chega como null no controlador apesar de o resto funcionar como deveria (o upload é feito corretamente) . Vou publicar minhas classes e formulario para ver se alguem me ajuda !!
Controlador.java
package br.com.jslsolucoes.erbuss.admin.controllers;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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.view.Results;
import br.com.jslsolucoes.erbuss.admin.annotations.Paginated;
import br.com.jslsolucoes.erbuss.admin.annotations.PutAccessInView;
import br.com.jslsolucoes.erbuss.admin.annotations.Rules;
import br.com.jslsolucoes.erbuss.admin.annotations.VerifyAccess;
import br.com.jslsolucoes.erbuss.admin.daos.ExplicacaoDao;
import br.com.jslsolucoes.erbuss.admin.models.Explicacao;
import br.com.jslsolucoes.erbuss.admin.util.view.VraptorViewUtil;
import com.google.appengine.api.blobstore.BlobKey;
import com.google.appengine.api.blobstore.BlobstoreService;
import com.google.appengine.api.blobstore.BlobstoreServiceFactory;
import com.google.appengine.api.images.ImagesService;
import com.google.appengine.api.images.ImagesServiceFactory;
@Resource
@Path("explicacao")
public class ExplicacaoController {
private ExplicacaoDao daoExplicacao;
private Result result;
private HttpServletResponse response;
private HttpServletRequest request;
private BlobstoreService blobstoreService;
public ExplicacaoController(Result result, ExplicacaoDao daoExplicacao,
HttpServletResponse response, HttpServletRequest request) {
this.result = result;
this.daoExplicacao = daoExplicacao;
this.response = response;
this.request = request;
this.blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
}
//Funciona belezinha
@Path("foto/{explicacao.id}")
public void foto(Explicacao explicacao) throws IOException, SQLException {
Explicacao loadExplicacao = daoExplicacao.load(explicacao.getId());
BlobKey blobKey = new BlobKey(loadExplicacao.getUrl());
blobstoreService.serve(blobKey, response);
result.use(Results.nothing());
}
@VerifyAccess
public void form() {
//Aqui ele pede pra criar uma url que vai na action do formulario que sai algo do tipo "/_ah/upload/_um_hash_louco"
this.result.include("uploadUrl",
blobstoreService.createUploadUrl("/explicacao/saveOrUpdate"));
}
public void message() {
}
@Post
public void saveOrUpdate(Explicacao explicacao) throws IOException, SQLException {
//Nesse ponto chega null
System.out.println(explicacao);
Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(request);
BlobKey foto = blobs.get("foto");
if (foto != null) {
ImagesService imagesService = ImagesServiceFactory
.getImagesService();
imagesService.applyTransform(
ImagesServiceFactory.makeResize(50, 50),
ImagesServiceFactory.makeImageFromBlob(foto));
//Aqui gera um null pointer exception é claro
explicacao.setUrl(foto.getKeyString());
}
result.include("operation", daoExplicacao.saveOrUpdate(explicacao2));
result.redirectTo(this).message();
}
}
E meu formulario
<form enctype="multipart/form-data" method="post" action="/_ah/upload/agxlcmJ1c3MtYWRtaW5yHAsSFV9fQmxvYlVwbG9hZFNlc3Npb25fXxipAQw" id="par_formulario">
<input type="hidden" name="explicacao.id"/>
Foto : <input type="file" name="foto"/>
Título :<input type="text" name="explicacao.titulo"/>
Descricao :<textarea name="explicacao.descricao"/>
</form>
Alguma dica ?