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>
