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