[RESOLVIDO] Vraptor enviar mais de um parametro para o controller

7 respostas
adrianohardcore

Boa noite , estou enviando dois parametros da jsp para o controller :

<form action="${pageContext.request.contextPath}/dser/${dser.id.dserest}/${dser.id.dserpar}" method="get"> 
        <input type="submit" value="Exibir" />
</form>

Os dois parametros aparecem na url corretamente , mas o controller que recebe ,

@Get("/dser/{dserpk.dserest}/{dserpk.dsernome}")
	public void exibir(Dser dser) {		
		dser = dserRepository.loadByDserPK(dser.getId().getDserest());
		result.include("dser", dser);		
	}

não funciona , ele retorna :

java.lang.NullPointerException

controller.DserController.exibir(DserController.java:41)

sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

java.lang.reflect.Method.invoke(Method.java:597)

br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:89)

br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:51)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)

br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)

br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)

br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)

com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)

Não sei mais oque fazer!Alguem tem um exemplo de manipulação de chave composto no controller , view e dao ? Neste mesmo projeto quando uso loadall não tenho problema , só tenho quando tento setar uma chave !

7 Respostas

Lucas_Cavalcanti

se o nome do parâmetro do método é dser, os parâmetros na URI devem começar com dser:

@Get("/dser/{dser.dserpk.dserest}/{dser.dserpk.dsernome}")

ou vc tem que receber a dserpk direto no método

adrianohardcore

Lucas Cavalcanti:
se o nome do parâmetro do método é dser, os parâmetros na URI devem começar com dser:

@Get("/dser/{dser.dserpk.dserest}/{dser.dserpk.dsernome}")

ou vc tem que receber a dserpk direto no método

Se eu colocar @Get("/dser/{dser.dserpk.dserest}/{dser.dserpk.dsernome}") , da este erro :

java.lang.IllegalArgumentException: Parameters paths are invalid: [dser.dserpk.dserest, dser.dserpk.dsernome] for method public void controller.DserController.exibir(model.Dser)

at br.com.caelum.vraptor.http.route.DefaultTypeFinder.getParameterTypes(DefaultTypeFinder.java:53)

at br.com.caelum.vraptor.http.route.DefaultRouteBuilder.addParametersInfo(DefaultRouteBuilder.java:194)

at <a href="http://br.com.caelum.vraptor.http.route.DefaultRouteBuilder.is">br.com.caelum.vraptor.http.route.DefaultRouteBuilder.is</a>(DefaultRouteBuilder.java:182)

at br.com.caelum.vraptor.http.route.PathAnnotationRoutesParser.registerRulesFor(PathAnnotationRoutesParser.java:101)

at br.com.caelum.vraptor.http.route.PathAnnotationRoutesParser.rulesFor(PathAnnotationRoutesParser.java:75)

at br.com.caelum.vraptor.ioc.ResourceHandler.handle(ResourceHandler.java:48)

at br.com.caelum.vraptor.ioc.spring.StereotypedBeansRegistrar.handleRefresh(StereotypedBeansRegistrar.java:63)

at br.com.caelum.vraptor.ioc.spring.StereotypedBeansRegistrar.onApplicationEvent(StereotypedBeansRegistrar.java:46)

at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:97)

at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:303)

at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:911)

at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:428)

at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.start(SpringBasedContainer.java:106)

at br.com.caelum.vraptor.ioc.spring.SpringProvider.start(SpringProvider.java:87)

at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:110)

at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:103)

at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:277)

at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)

at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382)

at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:103)

at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4638)

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5294)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3908)

at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:424)

at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1352)

at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1539)

at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1549)

at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1549)

at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1528)

at java.lang.Thread.run(Unknown Source)

Caused by: java.lang.NullPointerException

at br.com.caelum.vraptor.http.route.DefaultTypeFinder.getParameterTypes(DefaultTypeFinder.java:51)

… 30 more
B

adrianohardcore:
Boa noite , estou enviando dois parametros da jsp para o controller :

&lt;form action="${pageContext.request.contextPath}/dser/${dser.id.dserest}/${dser.id.dserpar}" method="get"&gt; 
        &lt;input type="submit" value="Exibir" /&gt;
&lt;/form&gt;

Os dois parametros aparecem na url corretamente , mas o controller que recebe ,

@Get("/dser/{dserpk.dserest}/{dserpk.dsernome}")
	public void exibir(Dser dser) {		
		dser = dserRepository.loadByDserPK(dser.getId().getDserest());
		result.include("dser", dser);		
	}

Cara, os parâmetros que você está enviando (dserest e dserpar) aparentemente são da propriedade “id” que fica dentro da classe Dser, e vc está enviando eles com a seguinte navegação entre as propriedades “dser.id.”… Porém na anotação você está recebendo eles diretamente na classe Dser (dserpk.dserest e dserpk.dsernome)…

Como o Lucas falou, o nome do parâmetro no seu método é dser, então os parâmetros enviados pela url têm que coincidir com ele. E também a navegação entre as propriedades. Coloca na anotação do método o seguinte: “/dser/{dser.id.dserest}/{dser.id.dserpar}”…

Tem outra coisa, na anotação você está mandando o VRaptor popular uma propriedade chamada “dsernome”, mas não envia ela pela url…

adrianohardcore

Vou colocar aquia a estrutura completa , pois não estou conseguindo fazer funcionar , talvez tenha alguma coisa no modelo ou no dao que esteja com problema .
Dser.java

package model;

import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "DSER")
public class Dser  {	
	@EmbeddedId
    private DserPK id;
	@Column(name = "DSERNOME")
	private String dsernome;
	@Column(name = "DSERSERIAL")
	private Long dserserial;
	@Column(name = "DSERDTALT")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dserdtalt;
	@Column(name = "DSERUSR")
	private Short dserusr;
	@Column(name = "DSERPAR1")
	private Long dserpar1;
	@Column(name = "DSERPAR2")
	private Long dserpar2;
	// @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
	@Column(name = "DSERPAR3")
	private BigDecimal dserpar3;
	//@Size(max = 20)
	@Column(name = "DSERPAR4")
	private String dserpar4;
	//@Size(max = 60)
	@Column(name = "DSERHIS")
	private String dserhis;	
	public void setDsernome(String dsernome) {
		this.dsernome = dsernome;
	}
	public String getDsernome() {
		return dsernome;
	}
	public void setDserserial(Long dserserial) {
		this.dserserial = dserserial;
	}
	public Long getDserserial() {
		return dserserial;
	}
	public void setDserdtalt(Date dserdtalt) {
		this.dserdtalt = dserdtalt;
	}
	public Date getDserdtalt() {
		return dserdtalt;
	}
	public void setDserusr(Short dserusr) {
		this.dserusr = dserusr;
	}
	public Short getDserusr() {
		return dserusr;
	}
	public void setDserpar1(Long dserpar1) {
		this.dserpar1 = dserpar1;
	}
	public Long getDserpar1() {
		return dserpar1;
	}
	public void setDserpar2(Long dserpar2) {
		this.dserpar2 = dserpar2;
	}
	public Long getDserpar2() {
		return dserpar2;
	}
	public void setDserpar3(BigDecimal dserpar3) {
		this.dserpar3 = dserpar3;
	}
	public BigDecimal getDserpar3() {
		return dserpar3;
	}
	public void setDserpar4(String dserpar4) {
		this.dserpar4 = dserpar4;
	}
	public String getDserpar4() {
		return dserpar4;
	}
	public void setDserhis(String dserhis) {
		this.dserhis = dserhis;
	}
	public String getDserhis() {
		return dserhis;
	}
	public void setId(DserPK id) {
		this.id = id;
	}
	public DserPK getId() {
		return id;
	}


}

DserPK.java

package model;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;


@Embeddable
public class DserPK implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Column
	private short dserest;
	@Column
	private String dserpar;
	public DserPK(){    	
	}

	public short getDserest() {
		return dserest;
	}

	public void setDserest(short dserest) {
		this.dserest = dserest;
	}

	public String getDserpar() {
		return dserpar;
	}

	public void setDserpar(String dserpar) {
		this.dserpar = dserpar;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + dserest;
		result = prime * result + ((dserpar == null) ? 0 : dserpar.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		DserPK other = (DserPK) obj;
		if (dserest != other.dserest)
			return false;
		if (dserpar == null) {
			if (other.dserpar != null)
				return false;
		} else if (!dserpar.equals(other.dserpar))
			return false;
		return true;
	}

}

DserRepository

package repository;


import java.util.Collection;

import model.Dser;


public interface DserRepository {
	public Collection&lt;Dser&gt; loadAll();		
	public Dser loadByDserPK(Object id);
	public void remove(Dser dser) ;	
	public Dser save(Dser dser) ;
}

DserDao

package dao;

import java.util.Collection;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import model.Dser;
import repository.DserRepository;
import br.com.caelum.vraptor.ioc.Component;

@Component
public class DserDao implements DserRepository{

	private final EntityManager manager;
	public DserDao(EntityManager manager){
		this.manager = manager;
	}

	public Collection&lt;Dser&gt; loadAll() {
		Query query = manager.createQuery("from Dser");
		@SuppressWarnings("unchecked")
		Collection&lt;Dser&gt; resultList = query.getResultList();
		return resultList;
	}


	public Dser save(Dser dser) {
		return manager.merge(dser);
	}

	public Dser loadByDser(Object id) {
		return manager.find(Dser.class, id);		
	}

	public Dser loadByDserPK(Object id) {
		return manager.find(Dser.class, id);
	}

	public void remove(Dser dser) {
		manager.remove(manager.getReference(Dser.class,dser.getId()));		
	}	
}

DserController

package controller;

import java.util.Collection;

import model.Dser;
import model.DserPK;
import repository.DserRepository;
import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.Validations;


@Resource
public class DserController {

	private final DserRepository dserRepository;
	private final Result result;
	private final Validator validator;

	public DserController(Validator validator,Result result, DserRepository dserRepository) {
		this.validator = validator;
		this.result = result;
		this.dserRepository = dserRepository;
	}

	@Get("/dser/{dserpk.dserest}/{dserpk.dserpar}/editar")  
	public void editar(Dser dser) {		
		dser = dserRepository.loadByDserPK(dser.getId());
		result.include("dser", dser).forwardTo(this).novo();
	}
	
	@Get("/dser/{dserpk.dserest}/{dserpk.dsernome}")  
	public void exibir(Dser dser) {
	    dser = dserRepository.loadByDserPK(dser.getId().getDserest());  
	    result.include("dser", dser);         
	} 

	@Get("/dser")
	public void listagem() {		
		Collection&lt;Dser&gt; dserList = dserRepository.loadAll();
		result.include("dserList", dserList);
	}	

	@Get("/dser/novo")
	public void novo() {
	}


	@Delete("/dser/{dserpk.dserest}/{dserpk.dserpar}")
	public void remover(Dser dser) {
		dserRepository.remove(dser);
		result
		.include("message", "Serialização removida com sucesso")
		.redirectTo(this).listagem();
	}	

	@Post("/dser")
	public void salvar(final Dser dser) {
		validator.validate(dser);
		validator.checking(new Validations(){{			
			//that(dser.getAgdnome().isEmpty() == false,"erro", "dser.agdnome.invalido","agdnome");			
		}});	      
		validator.onErrorUsePageOf(this).novo();		
		dserRepository.save(dser);	
		result
		.include("message", "Serialização salva com sucesso" )
		.redirectTo(this).listagem();		
	}
}

listagem.jsp //É a pagina que contem uma lista da tabela Dser que tem um botão para a pagina listar , nesta página listagem esta funcionando ok , inclusive as 2 chaves

&lt;head&gt;
&lt;title&gt;Vraptor Agenda 2 | Serialização [listagem]&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;table class="table table-striped table-bordered table-condensed"&gt;
		&lt;thead&gt;
			&lt;tr&gt;
				&lt;th&gt;&lt;/th&gt;
				&lt;th&gt;&lt;/th&gt;
				&lt;th&gt;&lt;/th&gt;
				&lt;th&gt;Est&lt;/th&gt;
				&lt;th&gt;Parâmetro&lt;/th&gt;
				&lt;th&gt;Nome&lt;/th&gt;
				&lt;th&gt;Serial&lt;/th&gt;
				&lt;th&gt;Dt.Alt&lt;/th&gt;
				&lt;th&gt;Par1&lt;/th&gt;
				&lt;th&gt;Par2&lt;/th&gt;
				&lt;th&gt;Par3&lt;/th&gt;
				&lt;th&gt;Par4&lt;/th&gt;
				&lt;th&gt;Hist&lt;/th&gt;
			&lt;/tr&gt;
		&lt;/thead&gt;
		&lt;tbody&gt;
			&lt;c:forEach items="${dserList}" var="dser"&gt;
				&lt;tr&gt;
					&lt;td&gt;
						&lt;form
							action="${pageContext.request.contextPath}/dser/${dser.id.dserest}/${dser.id.dserpar}/editar"
							method="get"&gt;
							&lt;input type="submit" value="Editar" /&gt;
						&lt;/form&gt;&lt;/td&gt;
					&lt;td&gt;

						&lt;form
							action="${pageContext.request.contextPath}/dser/${dser.id.dserest}/${dser.id.dserpar}"
							method="get"&gt;
							&lt;input type="submit" value="Exibir" /&gt;
						&lt;/form&gt;&lt;/td&gt;
					&lt;td&gt;
						&lt;form
							action="${pageContext.request.contextPath}/dser/${dser.id.dserest}/${dser.id.dserpar}/editar"
							method="post"&gt;
							&lt;input type="submit" value="Excluir" /&gt;
						&lt;/form&gt;&lt;/td&gt;
					&lt;td&gt;${dser.id.dserest}
					&lt;td&gt;${dser.id.dserpar}&lt;/td&gt;
					&lt;td&gt;${dser.dsernome}&lt;/td&gt;
					&lt;td&gt;${dser.dserserial}&lt;/td&gt;
					&lt;td&gt;${dser.dserdtalt}&lt;/td&gt;
					&lt;td&gt;${dser.dserpar1}&lt;/td&gt;
					&lt;td&gt;${dser.dserpar2}&lt;/td&gt;
					&lt;td&gt;${dser.dserpar3}&lt;/td&gt;
					&lt;td&gt;${dser.dserpar4}&lt;/td&gt;
					&lt;td&gt;${dser.dserhis}&lt;/td&gt;
				&lt;/tr&gt;
			&lt;/c:forEach&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;
&lt;/body&gt;

Se alguém tiver paciência de ler todo código , talvez ache o erro estúpido que estou cometendo!!!

B

Achei outra coisa. Você está mandando o repositório carregar uma entidade pela chave, mas não está passando um objeto da classe que definiu como identificadora, mas sim uma propriedade dela…

// Está assim no método exibir
dserRepository.loadByDserPK(dser.getId().getDserest());

// Mas deve ser assim...
dserRepository.loadByDserPK(dser.getId());
adrianohardcore
bob_sponja:
Achei outra coisa. Você está mandando o repositório carregar uma entidade pela chave, mas não está passando um objeto da classe que definiu como identificadora, mas sim uma propriedade dela...
// Está assim no método exibir
dserRepository.loadByDserPK(dser.getId().getDserest());

// Mas deve ser assim...
dserRepository.loadByDserPK(dser.getId());

Ufa ... deu certo ... mas tinha alguns lixos de testes tambem que me atrapalharam como dsernome e dser.getId().getDserest() , mas acho que o principal era o ... @Get("/dser/{dser.id.dserest}/{dser.id.dserpar}/editar") e tambem tinha duvida de quem iria receber , o Dser ou DserPK.

Muito obrigado !!!!!!!!!!!!!!!!!

B
adrianohardcore:
bob_sponja:
Achei outra coisa. Você está mandando o repositório carregar uma entidade pela chave, mas não está passando um objeto da classe que definiu como identificadora, mas sim uma propriedade dela...
// Está assim no método exibir
dserRepository.loadByDserPK(dser.getId().getDserest());

// Mas deve ser assim...
dserRepository.loadByDserPK(dser.getId());

Ufa ... deu certo ... mas tinha alguns lixos de testes tambem que me atrapalharam como dsernome e dser.getId().getDserest() , mas acho que o principal era o ... @Get("/dser/{dser.id.dserest}/{dser.id.dserpar}/editar") e tambem tinha duvida de quem iria receber , o Dser ou DserPK.

Muito obrigado !!!!!!!!!!!!!!!!!

Massa! Precisando, é só gritar...

Criado 5 de fevereiro de 2012
Ultima resposta 6 de fev. de 2012
Respostas 7
Participantes 3