VRaptor + Ajax + adicinar intens em uma lista, caminho das pedras

6 respostas
Danillo_Moreno

Pessoal, boa tarde!

Estou fazendo uma aplicação de cartões onde tenho um formulario de clientes e cada cliente pode possuir usuarios adicionais…

Então UM cliente possui MUITOS adiconais.

No meu formulário na area destinada a inclusão de um adicional eu coloquei os campos e um botão adiconar. Minha idéia é fazer via ajax a inclusão desse adicional na lista de adiconais do meu cliente, e deixar o formulario disponível para inclusão de mais um adicional.

Não estou sabendo como fazer isso, não manjo muito de ajax e estou meio perdido, quem puder me dar um help eu agradeço…

Espero ter sido claro.

Muito obrigado,
Danillo

6 Respostas

Danillo_Moreno

Tentei fazer da seguinte forma, mas não deu certo…

No meu formulario coloquei a parte para preencher o adicional e o botão incluir…

<fieldset>
			<legend>Adicionais</legend>
			<table cellpadding="0" cellspacing="2" border="0">
			<tr>
				<input type="hidden" id="cpfTitular" name="cliente.adicional.cpfTitular" value="${cliente.cpf}" />
				<td align="right"><label class="req" for="cpfAdicinal">CPF<span class="req">*</span>:</label></td>
				<td><input type="text" id="adicionalCpf" name="cliente.adicional.cpfAdicional" value="${cliente.adicional.cpfAdicinal}"/></td>
			</tr>
			<tr>
				<td align="right"><label class="req" for="nome">Nome<span class="req">*</span>:</label></td>
				<td><input type="text" id="adicionalNome" name="cliente.adicional.nome" value="${cliente.adicional.nome}"/></td>	
				<td align="right"><label class="req" for="nomeMeio">Nome do meio:</label></td>
				<td><input type="text" id="adicionalNomeMeio" name="cliente.adicional.nomeMeio" value="${cliente.adicional.nomeMeio}"/></td>
				<td align="right"><label class="req" for="sobrenome">Sobrenome<span class="req">*</span>:</label></td>
				<td><input type="text"id="adicionalSobrenome" name="cliente.adicional.sobrenome" value="${cliente.adicional.sobrenome}"/></td>	
			</tr>
			<tr>
				<td align="right"><label class="req" for="dataNascimento">Data de Nascimento<span class="req">*</span>:</label></td>
				<td><input type="text"id="adicionalDataNascimento" name="cliente.adicional.dataNascimento" value="${cliente.adicional.dataNascimento}" OnKeyPress="formatar(this, '##/##/####')" maxlength="10"/></td>
					
				<td align="right"><label class="req" for="parentesco">Parentesco<span class="req">*</span>:</label></td>
				<td><select id="adicionalParentesco" name="cliente.adicional.parentesco" >
                        <option value="">.. Selecione ..</option>
                        <c:forEach var="parentesco" items="${parentescos}">
                            <option value="${parentesco.codigo}">${parentesco.descricao}</option>
                        </c:forEach>
                    </select>
				</td>
			</tr>
			<tr>
			<td align="right" colspan="4">
				<input type="button" value="Incluir Adicional" onclick="incluirAdicional();"/>
			</td>
			</tr>
			</table>
		</fieldset>

A função do javascript ficou assim:

function incluirAdicional(){

			var meuArray = new Array(7);
			meuArray[0] = $('#cpfTitular').val();
			meuArray[1] = $('#adicionalCpf').val();
			meuArray[2] = $('#adicionalNome').val();
			meuArray[3] = $('#adicionalNomeMeio').val();
			meuArray[4] = $('#adicionalSobrenome').val();
			meuArray[5] = $('#adicionalDataNascimento').val();
			meuArray[6] = $('#adicionalParentesco').val();

				$.getJSON('<c:url value="/cliente/incluirAdicional/"/>' + meuArray, function (json) {
			 });
		}

na classe ClienteController coloquei o método incluirAdicional

@Get("/cliente/incluirAdicional/{meuArray}")
	public void incluirAdicional(ArrayList<?> meuArray){
		System.out.println("To aqui!!!!");
	}

Mas deu erro de casting:

java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.WildcardTypeImpl cannot be cast to java.lang.Class
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getActualType(OgnlParametersProvider.java:200)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createList(OgnlParametersProvider.java:183)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createSimpleParameter(OgnlParametersProvider.java:172)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:144)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createParameter(OgnlParametersProvider.java:122)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:85)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:105)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	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.disoft.interceptor.LoginInterceptor.intercept(LoginInterceptor.java:31)
	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.disoft.interceptor.PermissionInteceptor.intercept(PermissionInteceptor.java:38)
	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.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.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	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:44)
	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 com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
	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:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304)
	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)

Vou tentar arrumar o erro de casting, mas não sei se estou com a abordagem certa para esse caso…

Se alguem tiver uma dica agradeço…

Valeu…

Lucas_Cavalcanti

isso não vai funcionar…

primeiro, concatenar arrays na url não é o jeito de passar os parâmetros. O jeito seria usar algo do tipo:

$.getJSON('<c:url value="/cliente/incluirAdicional/"/>', {"adicionais", meuArray}, function (json) {  
});

assim vc vai passar variáveis com o nome “adicionais”

e vc precisa receber no método:

@Get("/cliente/incluirAdicional/{meuArray}")  
public void incluirAdicional(List<Adicional> adiconais){

vc precisa usar o mesmo nome do parâmetro, e se vc usa <?> o vraptor não tem como saber o que vai ser adicionado, certo?

Danillo_Moreno

Lucas, obrigado pela resposta…

Acabei mudando um pouco minha aboradagem pois vi que estava fazendo besteira…

Eu tenho uma classe Adicional, quando eu clico naquele botão de incluir devo incluir um objeto desse tipo, então fiz as alterações:

<fieldset>
			<legend>Adicionais</legend>
			<table cellpadding="0" cellspacing="2" border="0">
			<tr>
				<input type="hidden" id="cpfTitular" name="adicional.cpfTitular" value="${cliente.cpf}" />
				<td align="right"><label class="req" for="cpfAdicinal">CPF<span class="req">*</span>:</label></td>
				<td><input type="text" id="adicionalCpf" name="adicional.cpfAdicional" value="${adicional.cpfAdicional}"/></td>
			</tr>
			<tr>
				<td align="right"><label class="req" for="nome">Nome<span class="req">*</span>:</label></td>
				<td><input type="text" id="adicionalNome" name="adicional.nome" value="${adicional.nome}"/></td>	
				<td align="right"><label class="req" for="nomeMeio">Nome do meio:</label></td>
				<td><input type="text" id="adicionalNomeMeio" name="adicional.nomeMeio" value="${adicional.nomeMeio}"/></td>
				<td align="right"><label class="req" for="sobrenome">Sobrenome<span class="req">*</span>:</label></td>
				<td><input type="text"id="adicionalSobrenome" name="adicional.sobrenome" value="${adicional.sobrenome}"/></td>	
			</tr>
			<tr>
				<td align="right"><label class="req" for="dataNascimento">Data de Nascimento<span class="req">*</span>:</label></td>
				<td><input type="text"id="adicionalDataNascimento" name="adicional.dataNascimento" value="${adicional.dataNascimento}" OnKeyPress="formatar(this, '##/##/####')" maxlength="10"/></td>
					
				<td align="right"><label class="req" for="parentesco">Parentesco<span class="req">*</span>:</label></td>
				<td><select id="adicionalParentesco" name="adicional.parentesco" >
                        <option value="">.. Selecione ..</option>
                        <c:forEach var="parentesco" items="${parentescos}">
                            <option value="${parentesco.codigo}">${parentesco.descricao}</option>
                        </c:forEach>
                    </select>
				</td>
			</tr>
			<tr>
			<td align="right" colspan="4">
				<input type="button" value="Incluir Adicional" onclick="incluirAdicional();"/>
			</td>
			</tr>
			</table>
		</fieldset>

javascript:

function incluirAdicional(){
				$.getJSON('<c:url value="/cliente/incluirAdicional/"/>' + '${adicional}', function (json) {
			 });
		}

método no ClienteControler

@Get("/cliente/incluirAdicional/{adicional}")
	public void incluirAdicional(Adicional adicional){
		System.out.println("To aqui!!!!");
	}

Porem estou com erro de converter

br.com.caelum.vraptor.VRaptorException: Unable to find converter for br.com.disoft.cliente.Adicional
	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:178)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createSimpleParameter(OgnlParametersProvider.java:174)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:144)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createParameter(OgnlParametersProvider.java:122)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:85)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:105)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	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.disoft.interceptor.PermissionInteceptor.intercept(PermissionInteceptor.java:38)
	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.disoft.interceptor.LoginInterceptor.intercept(LoginInterceptor.java:31)
	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.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.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	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:44)
	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 com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
	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:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304)
	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)

Onde errei?

Muito obrigado…

Lucas_Cavalcanti

se vc for fazer desse jeito vc precisa especificar alguma propriedade… tipo adicional.id

Danillo_Moreno

Mas e se eu não tiver esse dado, adicional.id???

Minha entidade Cliente possui um List adicionais.

A minha necessidade é:

1 - Preencher os campos do formulário e clicar no botão incluir.
2 - Pegar esses dados e colocar na lista

Como o meu formulario está sendo preenchido agora não tenho nada salvo no banco ainda. Não tenho de onde pegar esse adicional.id

Não sei como proceder…

Não é possivel criar converter para objetos só para String, não é?

Lucas_Cavalcanti

se o adicional não existe ainda, nomeie os inputs como:

<input name="cliente.adicionais[0].nome" />
<input name="cliente.adicionais[0].email" />

<input name="cliente.adicionais[1].nome" />
<input name="cliente.adicionais[1].email" />
...

daí o código javascript de adicionar adicionais só adiciona mais inputs com os índices setados corretamente

Criado 16 de novembro de 2011
Ultima resposta 17 de nov. de 2011
Respostas 6
Participantes 2