Obter dados do form no vraptor3

7 respostas
barenko

Olá pessoal,

Comecei a usar o novo vraptor 3 para testes e a partir do projeto em branco, desenvolvi um projeto de testes. Consegui pegar dados do modelo e passar para a view, porém não consigo passar dados da view para o modelo.

Quando submeto o form para adicionar uma nova mensagem, o controller não consegue obter os valores da mensagem e o meu parâmetro sempre vem nulo, com o seguinte erro:

14/09/2009 16:59:33 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet default threw exception br.com.caelum.vraptor.http.InvalidParameterException: unable to retrieve values to invoke method at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:113) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:54) at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:51) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:58) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:58) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.core.URLParameterExtractorInterceptor.intercept(URLParameterExtractorInterceptor.java:45) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:70) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:71) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:99) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:37) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:97) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NoSuchMethodException: NotesController$list$[telefone removido]$2.getMessage() at java.lang.Class.getMethod(Unknown Source) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:109) ... 34 more

Estou utilizando o seguinte ambiente:
vraptor3 build5
tomcat 6.0
jre 1.6.0.15-b3

Já tentei de várias formas e não obtive êxito. Alguém poderia me dizer no que eu estou errando?

Obrigado

Seguem os trechos de código:

Modelo:

@Component
@ApplicationScoped
public class Notes {
    private static List<Message> messages = new ArrayList<Message>();

    static {
	Message m = new Message();
	m.setAuthor("Rafael");
	m.setMessage("Minha mensagem...");
	messages.add(m);
    }

    public void add(Message m) {
	System.out.format("Notes.add(%s: %s)\n", m.getAuthor(), m.getMessage());
	if (!messages.contains(m)) messages.add(m);
    }

    public List<Message> getMessages() {
	System.out.format("Notes.list: %d\n", messages.size());
	return messages;
    }

    public void remove(Message m) {
	System.out.format("Notes.remove(%s: %s)\n", m.getAuthor(), m.getMessage());
	messages.remove(m);
    }
}
@Component
public class Message {
    private Date createdAt;
    private String message;
    private String author;

    public Message() {
	super();
	createdAt = new Date();
    }

    public Date getCreatedAt() {
	return createdAt;
    }

    public String getMessage() {
	return message;
    }

    public void setMessage(String message) {
	this.message = message;
    }

    public String getAuthor() {
	return author;
    }

    public void setAuthor(String author) {
	this.author = author;
    }

    public void setCreatedAt(Date createdAt) {
	this.createdAt = createdAt;
    }

    @Override
    public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((author == null) ? 0 : author.hashCode());
	result = prime * result + ((message == null) ? 0 : message.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;
	Message other = (Message) obj;
	if (author == null) {
	    if (other.author != null) return false;
	} else if (!author.equals(other.author)) return false;
	if (message == null) {
	    if (other.message != null) return false;
	} else if (!message.equals(other.message)) return false;
	return true;
    }
}

Controle:

@Resource
public class NotesController {
    private static final String INDEX_PATH = "/";
    private static final String NOTES_PATH = "/notes/";
    private Result result;
    private Notes notes;
    private Validator validator;

    public NotesController(Notes notes, Result result, Validator validator) {
	this.result = result;
	this.notes = notes;
	this.validator = validator;
    }

    @Path(INDEX_PATH)
    public void index() {
	System.out.println("index.......");
	redirectToListMethod();
    }

    @Get
    @Path(NOTES_PATH)
    public void list() {
	System.out.println("list.......");
	result.include("messages", notes.getMessages());
    }

    @Post
    @Path(NOTES_PATH)
    public void add(final Message message) {
	System.out.println("add.......");

	notes.add(message);
	redirectToListMethod();
    }

    @Delete
    @Path(NOTES_PATH)
    public void remove(Message message) {
	System.out.println("remove.......");
	notes.remove(message);
	redirectToListMethod();
    }

    private void redirectToListMethod() {
	result.use(Results.logic()).redirectTo(this.getClass()).list();
    }
}

Visualização:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><fmt:message key="mensagem.lista.titulo"/></title>
</head>
<body>

<H1><fmt:message key="mensagem.lista.titulo"/></H1>

<table>
<c:forEach var="m" items="${messages}">
<tr><th id="createdAt"><fmt:formatDate type="both" timeStyle="default" dateStyle="default" value="${m.createdAt}" /></th></tr>
<tr><td id="message">${m.message}</td></tr>
<tr><td id="author" align="right">${m.author}</td></tr>
<tr><td> </td></tr>
</c:forEach>
</table>

<hr>
<form action="<c:url value="/notes/"/>" method="post">
<table border="1" width="400px">
<tr><th colspan="2"><fmt:message key="mensagem.nova"/></th></tr>
<tr><td width="80px"><fmt:message key="mensagem.autor"/></td><td width="320px"><input maxlength="30" size="50" name="msg.author" value="${message.author}" /></td></tr>
<tr><td valign="top"><fmt:message key="mensagem.mensagem"/></td><td><textarea cols="40" rows="5" name="msg.message"/>${message.message}</textarea></td></tr>
<tr><td> </td><td align="center"><input type="submit" value="<fmt:message key="mensagem.botao.add"/>"/></td></tr>
</table>
</form>

</body>
</html>

7 Respostas

Lucas_Cavalcanti

Evita usar o this.getClass().

O VRaptor cria vários proxies da sua classe, e quando você faz esse tipo de redirecionamento, pode
ser que a classe do proxy seja chamada, dando esse tipo de erro…

tenta trocar o this.getClass() por NotesController.class e ve se funciona

[]'s

barenko

@lucascs

Troquei para:

e continua com o mesmo erro.

Esse projeto começou no build 3, depois atualizei para o build 4 e 5, respectivamente. Os jars q estou utilizando são os mesmos da pasta lib do build 5.

Paulo_Silveira

barenko, a exception eh exatamente a mesma? ate o caused by? pode colar pra gente?

no beta 3 funcionava?

barenko

No beta 3 ocorreu exatamente o mesmo erro.

Eu faço o seguinte roteiro de testes:

  1. Ligo o tomcat 6.0
  2. Acesso o endereço http://localhost:8081/vraptor-test/notes/
  3. Clico no botão de submit (com ou sem valores preenchidos o efeito é o mesmo: ocorre o erro1 abaixo)
  4. Clico no botão voltar do navegador (Internal Web Browser)
  5. Clico novamente no botão de submit (desta vez ele chama o método Notes.add, porém com argumento nulo: erro2)
    OBS: Notei que se eu executar diretamente no firefox por fora do eclipse, não ocorre o erro1, apenas o erro2. O erro1 só ocorre no IE7 (browser que está sendo utilizado pelo internal web browser do eclipse).

erro1

15/09/2009 13:16:11 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet default threw exception br.com.caelum.vraptor.http.InvalidParameterException: unable to retrieve values to invoke method at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:115) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:81) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:54) at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:51) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:58) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:58) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.core.URLParameterExtractorInterceptor.intercept(URLParameterExtractorInterceptor.java:45) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:70) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:71) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:99) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:37) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:97) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NoSuchMethodException: NotesController$list$[telefone removido]$2.getMessage() at java.lang.Class.getMethod(Unknown Source) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:111) ... 34 more

erro2

15/09/2009 13:15:41 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet default threw exception br.com.caelum.vraptor.InterceptionException: java.lang.NullPointerException at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:84) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:54) at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:51) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:58) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:58) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.core.URLParameterExtractorInterceptor.intercept(URLParameterExtractorInterceptor.java:45) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:70) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71) at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:71) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:99) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:37) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:97) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NullPointerException at br.com.castecnologia.vraptor.model.bean.Notes.add(Notes.java:21) at br.com.castecnologia.vraptor.controller.NotesController.add(NotesController.java:56) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:62) ... 36 more

Lucas_Cavalcanti

o erro 2 acontece pq no seu formulário você tá passando os parâmetros:

msg.author = x
msg.message = y

mas na lógica tá recebendo

public void add(final Message message) {

você precisa colocar o mesmo nome do parâmetro do método da lógica, então o nome dos inputs deve ser:
message.author e message.message

quanto ao erro 1 só acontece dentro do eclipse? acontece direto no ie7 também?

[]'s

barenko

Muito bem, funcionou! Eu coloquei os valores mapeados certos, mas esqueci de mapear o nome dos parametros.

o erro1 só acontece quando o form não está com os parametros corretamente mapeados E você está utilizando o IE 7 (não testei em outras versões de IE).

Obrigado! Agora vou conseguir avançar nos testes :stuck_out_tongue:

Lucas_Cavalcanti

=)

continue mandando dúvidas e sugestões =)

Criado 14 de setembro de 2009
Ultima resposta 15 de set. de 2009
Respostas 7
Participantes 3