VRaptor 3 + Objectify - FJ28 [RESOLVIDO]

9 respostas
MABS

Olá!

Estou tentando fazer uma migração da aplicação da Apostila da Caelum FJ28 do hibernate para o Objectify só que infelizmente esta dando um erro.
Segue abaixo os códigos que eu estou utilizando:

Classe Produto:
import javax.persistence.Id;

import br.com.caelum.vraptor.ioc.Component;

public class Produto {

	@Id
	private long id;
	private String nome;
	private String descricao;
	private Double preco;

	public Produto(long id, String nome, String descricao, Double preco) {
		this.id = id;
		this.nome = nome;
		this.descricao = descricao;
		this.preco = preco;
	}

       Getters e Setters...
"formulario.jsp":
<form id="produtosForm" action="<c:url value="/produtos" />" method="post"">
	<fieldset>
		<legend>Adiciona Produto</legend>
		
		<label for="nome">Nome:</label>
		<input id="nome" class="required" minlength="3" type="text" name="produto.nome" value="${produto.nome}" />
		
		<label for="descricao">Descrição:</label>
		<textarea cols="28" rows="6" id="descricao" class="required" maxlength="40" name="produto.descricao">${produto.descricao}</textarea>
		
		<label for="preco">Preço:</label>
		<input id="preco" min="0" name="produto.preco" value="${produto.preco}" />
		
		<button type="submit">Enviar</button>
	</fieldset>
</form>

<!-- <script type="text/javascript">
	$('#produtosForm').validate();
</script> -->
Classe ProdutoController:
@Resource
public class ProdutoController {
	private ProdutoDAO dao;
	private Result result;
	private Validator validator;
	
	public ProdutoController(ProdutoDAO dao, Result result, Validator validator) {
		this.dao = dao;
		this.result = result;
		this.validator = validator;
	} 

	@Post
	@Path("/produtos")
	//@Restrito
	public void adiciona(Produto produto) {
//		if (produto.getNome() == null || produto.getNome().length() < 3) {
//			this.validator.add(new ValidationMessage("Nome é obrigatório e precisa ter mais de 3 letra", "produto.nome")); 
//		}
//		
//		if (produto.getDescricao() == null || produto.getDescricao().length() > 40) {
//			this.validator.add(new ValidationMessage("Descição é obrigatória não pode ter mais que 40 letras", "produto.descricao"));
//		}
//		
//		if (produto.getPreco() == null) {
//			this.validator.add(new ValidationMessage("Preço precisa ser positivo", "produto.preco"));
//		}
//		this.validator.onErrorUsePageOf(ProdutoController.class).formulario();
		
		this.dao.salva(produto);
//		this.result.redirectTo(this).lista();
	}
Obs. Estou deixando o código comentado, pois não acho importante algumas função por enquanto, meu interesse é só realizar o cadastro do produto sem nenhum erro. Classe ProdutoDao:
import br.com.caelum.vraptor.ioc.Component;
import br.com.mabs.goodbuynew.model.Produto;

import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyService;

@Component
public class ProdutoDAO {
	
	public Objectify ofy;
	
	public ProdutoDAO() {
		this.ofy = ObjectifyService.begin();
	}

	public void salva(Produto produto) {
		this.ofy.put(produto);
	}
[color=red]Mensagem de Erro:[/color]
br.com.caelum.vraptor.http.InvalidParameterException: unable to instantiate type class br.com.mabs.goodbuynew.model.Produto
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createOgnlContextFor(OgnlParametersProvider.java:186)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createParameter(OgnlParametersProvider.java:140)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:96)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:107)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:79)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:94)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
	at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.Server.handle(Server.java:326)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: net.vidageek.mirror.exception.MirrorException: Could not find constructor with args [] on class br.com.mabs.goodbuynew.model.Produto
	at net.vidageek.mirror.invoke.ConstructorHandlerByArgs.getConstructor(ConstructorHandlerByArgs.java:53)
	at net.vidageek.mirror.invoke.ConstructorHandlerByArgs.withArgs(ConstructorHandlerByArgs.java:36)
	at net.vidageek.mirror.invoke.ConstructorHandlerByArgs.withoutArgs(ConstructorHandlerByArgs.java:32)
	at br.com.caelum.vraptor.http.ognl.GenericNullHandler.instantiate(GenericNullHandler.java:74)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createOgnlContextFor(OgnlParametersProvider.java:184)
	... 41 more
Realmente não sei o que fazer mais!

Abraço!

9 Respostas

Lucas_Cavalcanti

se vc quer que a classe produto tenha um construtor não padrão, vc precisa usar o vraptor junto com o IOGI…

para isso, coloque esse jar no WEB-INF/lib:
https://github.com/caelum/vraptor/blob/master/vraptor-core/lib/optional/iogi/iogi-0.8.2.jar

e coloque essa configuração no web.xml (ou adicione na já existente)

<context-param>
    <param-name>br.com.caelum.vraptor.packages</param-name>
    <param-value>br.com.caelum.vraptor.http.iogi</param-value>
</context-param>
MABS

Adicionei o JAR e mudou o erro, eu não estou entende porque esta dando NullPointerException!

[color=red]Messagem de Erro:[/color]

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.NullPointerException at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:89) at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:94) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) Caused by: java.lang.NullPointerException at com.googlecode.objectify.ObjectifyFactory.getMetadataForEntity(ObjectifyFactory.java:264) at com.googlecode.objectify.impl.AsyncObjectifyImpl.put(AsyncObjectifyImpl.java:251) at com.googlecode.objectify.impl.AsyncObjectifyImpl.put(AsyncObjectifyImpl.java:229) at com.googlecode.objectify.impl.ObjectifyImpl.put(ObjectifyImpl.java:126) at br.com.mabs.goodbuynew.dao.ProdutoDAO.salva(ProdutoDAO.java:30) at br.com.mabs.goodbuynew.controller.ProdutoController.adiciona(ProdutoController.java:77) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:100) at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61) ... 53 more

Abraço!

Lucas_Cavalcanti

o nullpointer tem como raiz o seu produtoDAO:

at br.com.mabs.goodbuynew.dao.ProdutoDAO.salva(ProdutoDAO.java:30)  
    at br.com.mabs.goodbuynew.controller.ProdutoController.adiciona(ProdutoController.java:77)

tenta debugar aí e ver se tem alguma coisa nula sendo passada por aí

MABS

Na verdade não sei por qual motivo ainda mais os dados do formulário não esta chegando nem na classe Controller!

Assim que eu achar a cagada que eu fiz eu aviso e deixo o tópico como RESOLVIDO!

Que merda!RS*

Obrigado pela ajuda! Lucas.

Abraço!

MABS

Olá, Lucas!

Achei o erro, na verdade é bem simples. Quando era realizado o cadastro no Banco de Dados Relaciona (MySQL) não era necessário preencher o campo “ID” da tabela, pois este campo era gerado automaticamente (@GeneratedValue).
Agora eu estou usando um Banco de Dados sem Relacionamento (BigTable), sendo assim, não esta sendo gerado automaticamente o campo “ID”.
Mas na verdade eu estava contado que o campo “ID” fosse preenchido automaticamente mas sem ser seqüencial. Tinha esta certeza, pois o Sergio Lopes comentou sobre este fato no seguinte tópico: http://www.guj.com.br/java/241901-vraptor–objectify—google-app-enginegae-resolvido

Agora realmente ficou um interrogação, será que estou fazendo uma cagada, ou realmente não é gerado automaticamente ?

Abraço!

D

Isso de setar um id para o Objeto é porque você esta usando um long primitivo, altera para o Wrapper Long id que vai funcionar, o objectify verifica se esse id é null, caso seja ele cria um, senão ele deixa como esta, e nesse caso o seu id será sempre zero.

MABS

Olá, davisnog!

Valeu mano vou testar aqui e já dou uma resposta!

Abraço!

sergiolopes

Como o davisnog falou, precisa ser Long wrapper e não primitivo. Se for primitivo ele acha que já tem id (zero) e não gera. Precisa ser um Long e deixar null pro put() gerar.

Na doc do Objectify:

http://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify#Create_Your_Entity_Classes

MABS

Valeu Galera realmente era só o declaração da variável!

Abraço!

Criado 31 de maio de 2011
Ultima resposta 2 de jun. de 2011
Respostas 9
Participantes 4