Recuperar Valor Select com vraptor

15 respostas
K
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
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;

15 Respostas

king_of_gods

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>

Lucas_Cavalcanti

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

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

K

no controler esta assim

preciso receber o objeto para adicionar a uma visita

Rafael_Guerreiro

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
}
K

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

Lucas_Cavalcanti

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

K

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)

Lucas_Cavalcanti

tipoVisita não é um enum?

K
não, TipoVisita é uma Classe que
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;

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

Lucas_Cavalcanti

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

K
Por exemplo: eu tenho a o seguinte codigo
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;
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
<input type="hidden" name="visita.cliente.id" value="${cliente.id}/>

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

Lucas_Cavalcanti

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

K

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

@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;

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)
Lucas_Cavalcanti
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

K

Valeu, era isso mesmo.

Criado 20 de abril de 2011
Ultima resposta 28 de abr. de 2011
Respostas 15
Participantes 4