Struts 2 -- Preciso de uma ajuda

Caros amigos,estou iniciando no Struts e tenho as seguintes classes:

LogonBean.java

package br.com.struts2.bean;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Column;
/**
 * Classe Bean Entidade Logon
 * 
 * @author Gustavo Magni
 * @since 08/12
 * @version 1.0.0
 */

@Entity
@Table(name = "login")
public class LogonBean implements Serializable{
	

	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private long id;
	@Column(name = "nomeUsuario",length = 200)
	private String userName;
	@Column(name="senha",length = 20)
	private String password;
	
	public LogonBean(){
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}

LogonDAO.java

package br.com.struts2.dao;

import org.hibernate.Session;
import br.com.struts2.bean.LogonBean;

public class LogonDAO {

	private Session session;
	
	public LogonDAO(Session session){
		this.session = session;
	}
	
	public void save(LogonBean logon){
		session.save(logon);
	}
	
	public void delete(LogonBean logon){
		session.delete(logon);
	}
	
	public void update(LogonBean logon){
		session.update(logon);
	}
}

HibernateUtils.java

package br.com.hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.Transaction;

/**
 * Classe Util do Hibernate,nela constitui as principais operacoes
 * que o Hibernate oferece
 * 
 * @author Gustavo Magni
 * @since 01/12/2007
 * @version 1.0.0
 */
public class HibernateUtils {
	
	private static SessionFactory factory;
	private static AnnotationConfiguration annotationCfg;
	private static Session session;
	private static Transaction transaction;
	
	static {
		annotationCfg = new AnnotationConfiguration();
		//Leitura do arquivo .xml com o mapeamento da conexao
		annotationCfg.configure();
		//Recebe a fabrica de conexoes
		factory = annotationCfg.buildSessionFactory();
	}
	
	/**
	 * Metodo que a realiza a abertura de uma Session
	 * 
	 * @author Gustavo Magni
	 * @since 01/12
	 * @version 1.0.0
	 */
	public static Session openSession(){
		session = factory.openSession();
		return session;
	}
	
	/**
	 * Metodo que realiza o fechamento de uma Session
	 * 
	 * @author Gustavo Magni
	 * @since 01/12
	 * @version 1.0.0
	 */
	public static void closeSession(){
		try{
			if(session.isOpen()){
				session.close();
			}
		} catch (HibernateException e){
			e.printStackTrace();
		}
	}
	
	/**
	 * Metodo que realiza o fechamento de uma SessionFactory
	 * 
	 * @author Gustavo Magni
	 * @since 01/12
	 * @version 1.0.0
	 */
	public static void closeSessionFactory(){
		try{
		if(!factory.isClosed()){
			factory.close();
		}
		}catch (HibernateException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Metodo que inicia uma transacao do Hibernate
	 * 
	 * @author Gustavo Magni
	 * @since 01/12
	 * @version 1.0.0
	 */
	public static void beginTransaction(){
		try{
		if(transaction==null && session.isOpen()){
			transaction = (Transaction)session.beginTransaction();
		}
	} catch(HibernateException e){
		e.printStackTrace();
		}
	}
	
	/**
	 * Metodo que realiza o commit de uma transacao
	 * 
	 * @author Gustavo Magni
	 * @since 01/12/2007
	 * @version 1.0.0
	 */
	public static void commit(){
		try{
			if(transaction!= null && !transaction.wasCommitted() && !transaction.wasRolledBack()){
				transaction.commit();
			}
		}catch(HibernateException e){
			e.printStackTrace();
		}
	}
	
	/**
	 * Metodo que realiza o roolback em caso de falha na confirmação
	 * de uma transação
	 * 
	 * @author Gustavo Magni
	 * @since 01/12/2007
	 * @version 1.0.0
	 */
	public static void rollback(){
		try{
			if(transaction!=null && !transaction.wasCommitted() && !transaction.wasRolledBack()){
				transaction.rollback();
			}
		} catch(HibernateException e){
			e.printStackTrace();
		}
	}
	
	/**
	 * Metodo responsavel por criar tabelas anotadas no arquivo .xml
	 * lido pela AnnotationConfiguration
	 * 
	 * @author Gustavo Magni
	 * @since 01/12/2007
	 * @version 1.0.0
	 */
	public static void createTable(){
		new SchemaExport(annotationCfg).create(true,true);
	}
	
	/**
	 * Metodo responsavel por deletar tabelas anotadas 
	 * no arquivo .xml lido pela AnnotationConfiguration
	 * 
	 * @author Gustavo Magni
	 * @since 01/12/2007
	 * @version 1.0.0
	 */
	public static void removeTable(){
		new SchemaExport(annotationCfg).drop(true,true);
	}
	
	/**
	 * Metodo responsavel por atualizar tabelas anotadas
	 * no arquivo .xml lido pelas AnnotaionConfiguration
	 * 
	 * @author Gustavo Magni
	 * @since 01/12/2007
	 * @version 1.0.0
	 */
	public static void updateTable(){
		new SchemaExport(annotationCfg).execute(true,true,true,true);
	}
}

E a classe mais importante no qual estou tendo problemas

package br.com.struts2;

import br.com.hibernate.HibernateUtils;
import br.com.struts2.bean.LogonBean;
import br.com.struts2.dao.LogonDAO;

import com.opensymphony.xwork2.ActionSupport;


public class Logon extends ActionSupport{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private LogonBean login;
	
	private LogonDAO dao = new LogonDAO(HibernateUtils.openSession());

    public LogonBean getBean() {
		return login;
	}
	public void setBean(LogonBean login) {
		this.login = login;
	}
	
    public String salvar(){
    	HibernateUtils.beginTransaction();
    	dao.save(login);
    	HibernateUtils.commit();
    	HibernateUtils.closeSession();
    	
    	return SUCCESS;
    }
}

arquivo web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<display-name>
	Struts2Example</display-name>
	
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<include file="struts-default.xml" />
	
	<package name="default" extends="struts-default">
	<action name="Logon!*" method="{1}" class="br.com.struts2.Logon">
  	<result name="success">/sucesso.jsp</result>
  	<result name="input">/erro.jsp</result>
	</action>
	</package>
	
</struts>

index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Cadastro de Login de Usuario</title>
</head>
<body>
<center>
<b>Cadastro</b>
<a href= "Logon.jsp">Logon</a>
</center>
</body>
</html>

Logon.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Struts2</title>
</head>
<body>
<s:form action="Logon!salvar"> 
  <s:textfield name="login.userName" label="UserName"/>
  <s:password  name="login.password" label="Password"/>
  <s:submit/>
</s:form>
</body>
</body>
</html>

sucesso.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Sucesso</title>
</head>
<body>
<h2>Usuario <s:property value="username"/> cadastrado com sucesso!</h2>
<a href="index.jsp">Voltar</a>
</body>
</html>

erro.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>ERRO</title>
</head>
<body>
<b><i>ERRO NO LOGIN!</i></b>
</body>
</html>

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory name="hibernate-struts">
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/login</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
         <property name="hibernate.hbm2ddl.auto">drop-create</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        
         <!-- Classes a serem mapeadas -->
        <mapping class="br.com.struts2.bean.LogonBean" />
        
    </session-factory>
</hibernate-configuration>

O problema que tenho encontrado é o seguinte na classe Logon não estou conseguindo realizar a persistencia já que o meu objeto login está vindo nulo,portanto não estou conseguindo setar o conteudo vindo do request no objeto a pilha retornada é a seguinte:

java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity
	org.hibernate.event.SaveOrUpdateEvent.<init>(SaveOrUpdateEvent.java:40)
	org.hibernate.event.SaveOrUpdateEvent.<init>(SaveOrUpdateEvent.java:23)
	org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
	org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
	br.com.struts2.dao.LogonDAO.save(LogonDAO.java:15)
	br.com.struts2.Logon.salvar(Logon.java:29)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:399)
	com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:262)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:224)
	com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:213)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
	org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	com.opensymphony.xwork2.interceptor.ParametersInterceptor.intercept(ParametersInterceptor.java:161)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:105)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:83)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:207)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:74)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:127)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:107)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:206)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:115)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	com.opensymphony.xwork2.interceptor.PrepareInterceptor.intercept(PrepareInterceptor.java:115)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
	org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
	org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:507)
	org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421)

Alguem pdoeria me ajudar a solucionar o problema?Estaria faltando alguma lib do Struts no meu projeto?Estou tentando setar o request no objeto de forma errada?Estou em fase de aprendizado e por isso gostaria de alguma ajuda!!!

Um abraço

tente para ver o que acontece :

public LogonBean login;  

Herrera

Caro Herrera,

Obrigado pela ajuda,mas mesmo deixando o objeto como publico não obtenho sucesso!!!O mesmo continua sendo retornado!!!

Gustavo

Caro Herrera,

Resolvi o problema bastava alterar o nome dos métodos set/get de set/getBean para set/getLogin!!!

Um abraço e Obrigado

Se quiser me add no msn é gustavo.magnibueno@gmail.com

Véio então o Struts 2 é ótimo mas não faz milagre… :wink:

Lembre-se padrão get\set sempre tem que ter o mesmo nome da propriedade porq se não o Struts não vai saber como instanciar o objeto…

Valeu Rodrigo!!!Obrigado pela dica,quando aos erros,são normais pois estou iniciando a desenvolver com o mesmo,já que meu framework predileto é o VRaptor.

Um abraço