Problema Rest + vraptor

12 respostas
C

estou fazendo o projeto da nova apostila da caelum fj28, mas na parte de rest dá dando erro ao tentar abrir o formulario(“produtos/novo”), no atualizar e remover(não faz ação nenhuma no botão), o erro de abertura do formulário é:

23/12/2009 16:15:31 org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:vraptor-blank-project' did not find a matching property.
23/12/2009 16:15:31 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Arquivos de programas\Java\jre6\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Arquivos de programas/Java/jre6/bin/client;C:/Arquivos de programas/Java/jre6/bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\ARQUIV~1\Borland\Delphi6\Bin;C:\ARQUIV~1\Borland\Delphi6\Projects\Bpl;C:\Arquivos de programas\Microsoft SQL Server\80\Tools\Binn\;C:\Arquivos de programas\Microsoft SQL Server\90\Tools\binn\;C:\Arquivos de programas\Arquivos comuns\Autodesk Shared\;c:\Arquivos de programas\Java\jdk1.6.0_12\bin\;c:\Arquivos de programas\Java\jdk1.6.0_12\bin;.;
16:15:32,078  INFO [VRaptorApplicationContext] Refreshing Root WebApplicationContext: startup date [Wed Dec 23 16:15:32 BRST 2009]; root of context hierarchy
16:15:32,359  INFO [VRaptorApplicationContext] Scanning WEB-INF/classes: C:\Documents and Settings\Carlos Vinicios\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\vraptor-blank-project\WEB-INF\classes
16:15:32,515  INFO [DefaultListableBeanFactory] Overriding bean definition for bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor': replacing [Root bean: class [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] with [Root bean: class [br.com.caelum.vraptor.ioc.spring.InjectionBeanPostProcessor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]
23/12/2009 16:15:31 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
23/12/2009 16:15:31 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 564 ms
23/12/2009 16:15:31 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
23/12/2009 16:15:31 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.20
16:15:32,890  INFO [DefaultListableBeanFactory] Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@100bac2: defining beans [defaultRoutes,encodingHandlerFactory,pathAnnotationRoutesParser,objenesisProxifier,XStreamXMLDeserializer,defaultMethodNotAllowedHandler,defaultResourceNotFoundHandler,emptyElementsRemoval,defaultAcceptHeaderToFormat,defaultDeserializers,defaultTypeFinder,asmBasedTypeCreator,defaultResourceTranslator,noRoutesConfiguration,defaultInterceptorRegistry,defaultMultipartConfig,defaultRouter,defaultConverters,paranamerNameProvider,defaultTypeNameExtractor,stereotypeHandler,converterHandler,interceptorStereotypeHandler,deserializesHandler,stereotypedBeansRegistrar,defaultSpringLocator,defaultMethodInfo,defaultStatus,defaultRefererResult,deserializingInterceptor,defaultPageResult,defaultOutjector,XStreamXMLSerialization,downloadInterceptor,defaultPathResolver,multipartInterceptor,interceptorListPriorToExecutionExtractor,outjectResult,defaultValidator,defaultResult,resourceLookupInterceptor,XStreamJSONSerialization,defaultRepresentationResult,jstlLocalization,defaultFormatResolver,executeMethodInterceptor,applicationConfiguration,defaultValidationViewsFactory,forwardToDefaultViewInterceptor,flashInterceptor,defaultHttpResult,parametersInstantiatorInterceptor,emptyResult,ognlParametersProvider,defaultLogicResult,instantiateInterceptor,bigDecimalConverter,bigIntegerConverter,booleanConverter,byteConverter,characterConverter,doubleConverter,enumConverter,floatConverter,integerConverter,localeBasedCalendarConverter,localeBasedDateConverter,longConverter,primitiveBooleanConverter,primitiveByteConverter,primitiveCharConverter,primitiveDoubleConverter,primitiveFloatConverter,primitiveIntConverter,primitiveLongConverter,primitiveShortConverter,shortConverter,uploadedFileConverter,VRaptorRequestProvider,httpServletRequestProvider,httpServletResponseProvider,httpSessionProvider,defaultRequestExecution,defaultInterceptorStack,produtosController,produtoDao,criadorDeSessionFactory,criadorDeSessoes,mundo,indexController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.aop.config.internalAutoProxyCreator,cacheBasedTypeCreator]; root of factory hierarchy
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
16:15:34,531  INFO [DefaultConverters   ] Registering bundled converters
16:15:34,593  INFO [RouteBuilder        ] /produtos/novo --> public void br.com.caelum.goodbuy.controller.ProdutosController.formulario()
16:15:34,593  INFO [RouteBuilder        ] /produtos/{id} --> public br.com.caelum.goodbuy.Modelo.Produto br.com.caelum.goodbuy.controller.ProdutosController.edita(java.lang.Long)
16:15:34,609  INFO [RouteBuilder        ] /produtos/{produtos.id} --> public void br.com.caelum.goodbuy.controller.ProdutosController.altera(br.com.caelum.goodbuy.Modelo.Produto)
16:15:34,609  INFO [RouteBuilder        ] /produtos --> public java.util.List br.com.caelum.goodbuy.controller.ProdutosController.lista()
16:15:34,609  INFO [RouteBuilder        ] /produtos --> public void br.com.caelum.goodbuy.controller.ProdutosController.adiciona(br.com.caelum.goodbuy.Modelo.Produto)
23/12/2009 16:15:34 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
23/12/2009 16:15:34 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
23/12/2009 16:15:34 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/47  config=null
23/12/2009 16:15:34 org.apache.catalina.startup.Catalina start
INFO: Server startup in 3475 ms
16:15:34,609  INFO [RouteBuilder        ] /produtos/{id} --> public void br.com.caelum.goodbuy.controller.ProdutosController.remove(java.lang.Long)
16:15:34,609  INFO [RouteBuilder        ] /mundo/boasVindas --> public java.lang.String br.com.caelum.goodbuy.Mundo.boasVindas()
16:15:34,609  INFO [RouteBuilder        ] /mundo/paises --> public java.util.List br.com.caelum.goodbuy.Mundo.paises()
16:15:34,609  INFO [RouteBuilder        ] /mundo/num --> public int br.com.caelum.goodbuy.Mundo.num()
16:15:34,609  INFO [RouteBuilder        ] /mundo/exibir --> public br.com.caelum.goodbuy.Modelo.Produto br.com.caelum.goodbuy.Mundo.exibir()
16:15:34,625  INFO [RouteBuilder        ] / --> public void br.com.caelum.vraptor.blank.IndexController.index()
16:15:34,625  INFO [VRaptor             ] VRaptor 3 successfuly initialized
23/12/2009 16:15:36 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException: There are two rules that matches the uri '/produtos/novo' with method GET: [[FixedMethodStrategy: uri /produtos/novo methods [GET]], [FixedMethodStrategy: uri /produtos/{id} methods [GET]]] with same priority. Consider using @Path priority attribute.
	at br.com.caelum.vraptor.http.route.DefaultRouter.checkIfThereIsAnotherRoute(DefaultRouter.java:106)
	at br.com.caelum.vraptor.http.route.DefaultRouter.parse(DefaultRouter.java:97)
	at br.com.caelum.vraptor.http.DefaultResourceTranslator.translate(DefaultResourceTranslator.java:52)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:64)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Unknown Source)

ProdutosController

package br.com.caelum.goodbuy.controller;

import java.util.List;

import br.com.caelum.goodbuy.dao.ProdutoDao;
import br.com.caelum.goodbuy.Modelo.Produto;
import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Put;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.Hibernate;
import br.com.caelum.vraptor.view.Results;

@Resource
public class ProdutosController {

	private ProdutoDao dao;
	private Result result;
	private Validator validator;
	
	public ProdutosController(ProdutoDao dao, Result result, Validator validador)
	{
		this.dao = dao;
		this.result = result;
		this.validator = validador;
	}
	
	@Get
	@Path("/produtos/novo")	
	public void formulario()
	{
	}
	
	@Get
	@Path("/produtos/{id}")
	public Produto edita(Long Id)
	{
		return dao.carrega(Id);
	}
	
	@Put
	@Path("/produtos/{produtos.id}")
	public void altera(Produto produto)
	{
		dao.atualizar(produto);
		result.redirectTo(ProdutosController.class).lista();
	}
	
	@Post
	@Path("/produtos")
	public void adiciona(Produto produto)
	{
		validator.addAll(Hibernate.validate(produto));
		validator.onErrorUse(Results.page()).of(ProdutosController.class).formulario();
		
		dao.salva(produto);
		result.redirectTo(ProdutosController.class).lista();
	}
	
	@Delete
	@Path("/produtos/{id}")
	public void remove(Long id)
	{
		Produto produto = dao.carrega(id);
		dao.remover(produto);
		result.redirectTo(ProdutosController.class).lista();
	}
	
	@Get
	@Path("/produtos")
	public List<Produto> lista()
	{
		return dao.listaTudo();
	}
}

como corrigir isto?

12 Respostas

Scoobydoo

Você pode corrigir isso instalando todas as library --’’
além disso voce tem 2 metodos Get com a mesma prioridade

C

como eu resolvo esse problema com os Gets?

Scoobydoo

Você possui dois métodos respondendo para um mesmo URI, onde o correto é ter apenas um.
A anotação @Path com o parametro //produtos/{id} está tando no método edita como no formulario.
Isso não pode acontecer, o URI tem que ser único.

Além disso você precisa entender melhor como funciona o bind dos valores que vem do request.
Quando você usar {id} no @Path o vraptor vai procurar no seu método um objeto com o nome usuarios e nele vai tentar injetar o atributo id.
No seu caso você não tem em nenhum dos métodos o atributo usuarios.

Desculpe se não consegui te explicar direito, estou com um pouco de pressa agora.
Mas sinta-se a vontade de questionar se você não entendeu.

Abraços

é o que o cara falou ali em baixo

Lucas_Cavalcanti

o problema está nesse método:

@Get  
      @Path("/produtos/{id}")  
      public Produto edita(Long Id)  
      {  
          return dao.carrega(Id);  
      }

troque o Long Id por Long id… o parametro que vc colocou no Path tem que ter o mesmo nome do parametro do método.

esse método tb vai dar problema, pelo mesmo motivo:

@Put  
     @Path("/produtos/{produtos.id}")  
     public void altera(Produto produto)  
     {  
         dao.atualizar(produto);  
         result.redirectTo(ProdutosController.class).lista();  
     }

troque o {produtos.id} por {produto.id}

C

vlw pelas dicas

o formulario(novo produto) agora ta funcionando mas o atualizar e remover não

erro do atualizar:

23/12/2009 17:02:47 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
java.lang.IllegalArgumentException: HTTP Method not known: Enviar
	at br.com.caelum.vraptor.resource.HttpMethod.of(HttpMethod.java:58)
	at br.com.caelum.vraptor.http.DefaultResourceTranslator.translate(DefaultResourceTranslator.java:52)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:64)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
Scoobydoo

Tenta isso
coloque um @Transactional antes deles

Lucas_Cavalcanti

cvinicios, vc provavelmente colocou algum input ou button com name="_method" e value=“Enviar”…

se vc fez igual a apostila, vc tem que fazer:

<button type="submit" name="_method" value="DELETE">Enviar</button>
ou
<button type="submit" name="_method" value="PUT">Enviar</button>

senão vc tem que criar um input hidden e um submit separados…

C

tá igual a apostila

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<form action="<c:url value="/produtos/${produto.id}"/>" method="post">
		<fieldset>
			<legend>Editar Produto</legend>
			
			<label for="nome">Nome:</label>
			<input id="nome" type="text" name="produto.nome" value="${produto.nome}"/>
			
			<label for="descricao">Descrição:</label>
			<input id="descricao" type="text" name="produto.descricao" value="${produto.descricao}"/>
			
			<label for="preco">Preço:</label>
			<input type="text" name="produto.preco" value="${produto.preco }"/>
			
			<button type="submit" name="_method" value="put"> Enviar </button>
		</fieldset>
	</form>
</body>
</html>
Lucas_Cavalcanti

Vc tah testando no Internet explorer né?

faz um favor: testa no Firefox e vê se dá o mesmo problema… e me fala qual é o resultado

se ainda estiver com problema, troque o button por

<input type="hidden"  name="_method" value="put" />
<input type="submit"  value="Enviar"/>
C

no firefox funcionou certinho, como eu faço para o internet explorer?

Lucas_Cavalcanti

substitui todos os buttons pelo código que eu coloquei na última mensagem…

tome cuidado pra mudar o _method pro cara certo (PUT ou DELETE)

ou pare de usar IE :stuck_out_tongue:

C

vlw pelas dicas,

t+

Criado 22 de janeiro de 2010
Ultima resposta 22 de jan. de 2010
Respostas 12
Participantes 3