Recuperar Valor Select com vraptor

tenho o seguinte codigo na minha jsp

<select name="tipoVisita" id="tipo_visita" value="tipoVisita"> <c:forEach items="${tipos}" var="tipo"> <option value="${tipo}">${tipo.tipo}</option> </c:forEach> </select>

só que não consigo recuperar no controler, o tipoVisita é um objeto
classe TipoVIsita

[code]public class TipoVisita implements Serializable {

@Id
@SequenceGenerator(name="SEQ_TPVIS", sequenceName="SEQ_TIPOVISITA", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_TPVIS")
@Column(name="tpvis_id")
private Integer id;

@Column(name="tpvis_tipo", nullable=false, length=60)
private String tipo;

@Column(name="tpvis_comentario", length=250)
private String comentario;
[/code]

Tenta isso.

<select name="tipoVisita" id="tipo_visita" value="${tipoVisita.tipo}"> <c:forEach items="${tipos}" var="tipo"> <option value="${tipo}">${tipo.tipo}</option> </c:forEach> </select>

a tag não tem o atributo value, ele está nas options…

no controller vc está recebendo um parâmetro chamado tipoVisita?

no controler esta assim

preciso receber o objeto para adicionar a uma visita

No meu projeto eu passo só o ID e depois eu faço uma consulta e trago o objeto completo…

JSP:

        <select id="autor" name="acervo.autor.codigoAutor" class="componente" style="width: 100%;" >
		 <c:forEach var="autor" items="${listaAutor}">
			 <option value="${autor.codigoAutor}"> ${autor.nomeAutor}</option>
		 </c:forEach>
	</select>

Controller:

public void adiciona(Acervo acervo){
      //aqui eu capturo o ID do autor (que é um atributo no meu acervo) e consulto o autor
      acervo.setAutor(autorDAO.consultar(acervo.getAutor().getCodigoAutor()));
      //restante
}

-Edit-
dá uma olhada neste tópico também:
http://www.guj.com.br/java/236139-resolvidocombobox-usando-vraptor

-Edit-
o “name” do seu select tem q ser igual ao nome do parametro que vc recebe, exemplo:

<input name="brocolis" />
public void fazAlgoComBrocolis(String brocolis){
      //fazendo algo
}

Mais não tem como recuperar o objeto inteiro para evitar realizar uma consulta no banco?

se o nome do parâmetro é “tipo”, o name do select tb tem que ser “tipo”

coloquei da seguinte maneira

<select name="tipo"> <c:forEach items="${tipos}" var="tipo"> <option value="${tipo}">${tipo.tipo}</option> </c:forEach> </select>

e recebi a seguinte exception

25/04/2011 08:02:39 org.apache.catalina.core.StandardWrapperValve invoke GRAVE: Servlet.service() for servlet [default] in context with path [/sistecam] threw exception br.com.caelum.vraptor.VRaptorException: Unable to find converter for br.com.amazonas.sistecam.entities.TipoVisita at br.com.caelum.vraptor.core.DefaultConverters.to(DefaultConverters.java:59) at br.com.caelum.vraptor.http.ognl.VRaptorConvertersAdapter.convert(VRaptorConvertersAdapter.java:59) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.convert(OgnlParametersProvider.java:213) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createSimpleParameter(OgnlParametersProvider.java:209) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createParameter(OgnlParametersProvider.java:133) 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.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.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.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) 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.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) 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.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.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.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662)

tipoVisita não é um enum?

não, TipoVisita é uma Classe que

[code]public class TipoVisita implements Serializable {

@Id
@SequenceGenerator(name="SEQ_TPVIS", sequenceName="SEQ_TIPOVISITA", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_TPVIS")
@Column(name="tpvis_id")
private Integer id;

@Column(name="tpvis_tipo", nullable=false, length=60)
private String tipo;

@Column(name="tpvis_comentario", length=250)
private String comentario;[/code]

os tipos são recuperados no banco de dados e populam o select

então o select tem que se chamar tipo.id e o value das options também tem que ser o id do tipo…

Por exemplo:
eu tenho a o seguinte codigo

[code]public class Visita implements Serializable {

@Id
@AttributeOverrides({
    @AttributeOverride(name="visID", column=@Column(name="vis_id", nullable=false, precision=10, scale=0)),
    @AttributeOverride(name="tecID", column=@Column(name="vis_tec_codext", nullable=false, precision=10, scale=0)),
    @AttributeOverride(name="visitaSequencia", column=@Column(name="vis_sequencia", nullable=false, precision=10, scale=0))
})
@Column(name="vis_id", nullable=false)
private VisitaID id;
 .
 .
 .


@ManyToOne
@JoinColumns({
   @JoinColumn(name="vis_cli_codigo", referencedColumnName="cli_codext", insertable=true, updatable=true),
   @JoinColumn(name="vis_cli_filial", referencedColumnName="cli_fili", insertable=true, updatable=true),
   @JoinColumn(name="vis_cli_regiao", referencedColumnName="cli_regi", insertable=true, updatable=true)
})
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.SAVE_UPDATE)
private Cliente cliente;

[/code]

queria saber se consigo na minha jsp adicionar o o objeto cliente que esta na minha seção a visita
tipo

<input type="hidden" name="visita.cliente" value="${cliente}/>
onde cliente foi enviado pelo controller
ou eu tenho que fazer

pois acho que do primeiro jeito seria mais facil, como se fosse um visita.setCliente(cliente);

vc precisa passar pelo id mesmo…

lembre-se que vc está gerando um HTML, e no html não existe uma representação de Cliente…

passando o id, o hibernate já consegue se virar

Obrigado Lucas

Agora estou com problema parar recuperar um valor que o usuario selecionou em um checkbox

JSP

<c:forEach items="${emails}" var="email" varStatus="s"> <input type="checkbox" name="visita.email[${s.index}].email" id="e-mail" value="${email}">${email}<br/> </c:forEach>

Classe Visita

[code]@Entity
@Table(name=“visita”, schema=“Tecnicos”)
public class Visita implements Serializable {

@Id
@AttributeOverrides({
    @AttributeOverride(name="visID", column=@Column(name="vis_id", nullable=false, precision=10, scale=0)),
    @AttributeOverride(name="tecID", column=@Column(name="vis_tec_codext", nullable=false, precision=10, scale=0)),
    @AttributeOverride(name="visitaSequencia", column=@Column(name="vis_sequencia", nullable=false, precision=10, scale=0))
})
@Column(name="vis_id", nullable=false)
private VisitaID id;

//outros atributos da classe

@OneToMany(mappedBy="visita", fetch=FetchType.LAZY)
@Cascade(CascadeType.ALL)
private Collection<EmailEnvio> email;[/code]

quando executo a aplicacao ocorre um stackOVerflow

GRAVE: Servlet.service() for servlet [default] in context with path [/sistecam] threw exception net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method setEmail at net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:45) at net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54) at br.com.caelum.vraptor.http.ognl.ReflectionBasedNullHandler.nullPropertyValue(ReflectionBasedNullHandler.java:85) at ognl.ASTProperty.getValueBody(ASTProperty.java:118) at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) at ognl.SimpleNode.getValue(SimpleNode.java:236) at ognl.ASTChain.setValueBody(ASTChain.java:222) at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220) at ognl.SimpleNode.setValue(SimpleNode.java:279) at ognl.Ognl.setValue(Ognl.java:737) at ognl.Ognl.setValue(Ognl.java:783) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.setProperty(OgnlParametersProvider.java:157) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createParameter(OgnlParametersProvider.java:144) 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.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.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.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.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.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.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.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) Caused by: java.lang.StackOverflowError at br.com.amazonas.sistecam.entities.Visita.setEmail(Visita.java:254) at br.com.amazonas.sistecam.entities.Visita.setEmail(Visita.java:254) at br.com.amazonas.sistecam.entities.Visita.setEmail(Visita.java:254) at br.com.amazonas.sistecam.entities.Visita.setEmail(Visita.java:254) at br.com.amazonas.sistecam.entities.Visita.setEmail(Visita.java:254) at br.com.amazonas.sistecam.entities.Visita.setEmail(Visita.java:254)


Caused by: java.lang.StackOverflowError  
    at br.com.amazonas.sistecam.entities.Visita.setEmail(Visita.java:254)  
    at br.com.amazonas.sistecam.entities.Visita.setEmail(Visita.java:254)  
    at br.com.amazonas.sistecam.entities.Visita.setEmail(Visita.java:254)  
    at br.com.amazonas.sistecam.entities.Visita.setEmail(Visita.java:254)  
    at br.com.amazonas.sistecam.entities.Visita.setEmail(Visita.java:254)  
    at br.com.amazonas.sistecam.entities.Visita.setEmail(Visita.java:254)  

seu método setEmail deve estar chamando ele mesmo

Valeu, era isso mesmo.