[VRaptor 3] NoClassDefFoundError quando entidade é passada como parametro no Controller

10 respostas
D

Oi,

sou novo no VRaptor e to com um problema que acho que é simples…

fiz um formulário onde tem campos de 2 entidades: User e Company.
Na minha Controller eu estou tentando receber estas duas entidades populadas do form.

fiz da seguinte maneira:

form.jsp - um form simples que os campos de input tem o atributo name com “user.firstName” por exemplo…

<form action="signup/create" method="post" class="ui-form-vertical">
				<h3>1. Informações de contato</h3>
				<fieldset>
					<label for="firstName">Primeiro Nome:</label>
					<input id="firstName" name="user.firstName" type="text" size="30" />
					
					<label for="lastName">Sobrenome: </label>
					<input id="lastName" name="user.lastName" type="text" size="30" />
					
					<label for="phone">Telefone: </label>
					<input id="phone" name="user.phone" type="text" size="30" />
					
					<label for="opc"></label>					
					<span class="opc">Opcional &mdash; Nós podemos entrar em contato pelo telefone</span>
					<br/>
					
					<label for="email">Email: </label>
					<input id="email" name="user.email" type="text" size="50" />
				</fieldset>
	
				<h3>2. Informações da organização</h3>
				<fieldset>
					<label for="orgName">Nome da organização: </label>
					<input id="orgName" name="company.name" type="text" size="25" />
					<br/>
					
					<label for="country">País: </label>
					<select id="country" name="company.country">
						<option>Brasil</option>
					</select>
				</fieldset>
	
				<h3>3. Senha</h3>
				<fieldset>
					<label for="password">Senha: </label>
					<input id="password" name="user.password" type="password" size="25" />
					
					<label for="password2">Confirmação senha: </label>
					<input id="password2" name="password2" type="password" size="25" />
				</fieldset>
	
				<h3>4. Onde nos encontrou?</h3>
				<fieldset>
					<label for="whereFindUs">Onde: </label>
					<select id="whereFindUs" name="company.whereFindUs">
						<option>Google</option>
					</select>
				</fieldset>
				
				<input type="submit" value="Criar conta" onclick="validate()"/>
			</form>

UserController.java - meu método que recebe o form

@Path("/signup/create")
	public void signUpCreate(User user, Company company) {
		System.out.println(user.toString());
		System.out.println(company.toString());
		
		result.redirectTo(DashboardController.class).dashboard();
	}

e quando dou submit no form recebo a exception:

Nos logs aparecem:

O que estou fazendo de errado?

obs: estou usando o Tiles 2… mas acho que isto nao está influenciando no erro…

Valeu!

10 Respostas

Guevara

A classe User está mapeada ou anotada corretamente? Parece que não encontrou a classe, ela foi importada no Controller?
[]s

D

minha classe User está assim:

@Entity
public class User implements BaseBean {

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	
	private String firstName;
	private String lastName;
	private String email;
	private String phone;
	private String password;

o problema nao é a falta da class ou de suas dependencias, pois na mesma Controller, em outro método que nao recebe parâmetro eu instancio essa classe sem problemas nenhum

valeu

Lucas_Cavalcanti

essa classe tá em outro projeto? se sim, esse projeto tá sendo exportado junto? (Java EE Module Dependencies no eclipse)

tah em outro jar? se sim, esse jar tah na pasta WEB-INF/lib?

D

Oi Lucas,

Não… a classe está no mesmo projeto…

mas fiquei desconfiado do Tiles… e entao tirei ele do web.xml e fiz uma jsp crua apenas com o form… e aconteceu o mesmo erro:

fiz um outro teste: removi os parametros User e Company do método, e dentro do método eu instancio as classes via ‘new’. E a instancia é criada normalmente. ou seja, nao é problema de classpath

valeu!

Lucas_Cavalcanti

tenta dar um clean tanto no projeto quanto no servidor e rodar de novo…

tenta criar uma outra classe e receber como parâmetro e ver se funciona

D

Oi Lucas,
obrigado pelo suporte.

fiz o clean no projeto… e no limpei os temps e work do tomcat tb… mas nao resolveu nao… :frowning:

pra mostrar que nao to ficando louco… heheheh… e que minha classe User ta no mesmo projeto, segue em anexo no post um printscreen do meu eclipse.
até pq no mesmo projeto na mesma controller, eu consigo usar a classe User numa boa… mas nao quando tento recebe-la via parametro de método de controller

Obs: estou rodando o projeto direto do meu eclipse
versao vraptor: 3.1.3

valeu!


D

tb desconfiava do OpenJDK… mas mesmo mudando pra JDK da Sun/Oracle acontece a mesma coisa…

tb fiz um bean novo Teste.java… limpo, sem as annotations do JPA… mas mesmo assim deu o mesmo erro… :frowning:

D

Oi Lucas

Resolvi o problema… sabia que era cagada minha… heheh

eu não tinha os jars (do vraptor e suas dependencias) no meu WEB-INF/lib

como eu estou usando o maven, eu nao mantinha os jars dentro do meu projeto… pois nao queria commitar as libs…

copiei agora os jars para meu WEB-INF/lib e coloquei a pasta no .gitignore para nao ser commitadas… e funcionou…

mas uma vez que os jars estavam no classpath do projeto e do tomcat, ainda sim sou obrigado a manter os jars dentro do projeto?
digo isto porque isso tira um pouco de toda dependencia ser automatizada e controlada pelo maven… uma vez que quando eu preciso adicionar uma nova dependencia, eu só adiciono no pom.xml e depois faço um mvn eclipse:eclipse para atualizar o classpath do meu projeto…

agora tendo copiar os jars para o WEB-INF/lib, após colocar uma nova dependecia ou alterar alguma versão, tenho que copiar os novos jars para a pasta WEB-INF/lib

além da perda de um setup rápido do ambiente de desenvolvimento… que antes era feito apenas com um git clone e depois um mvn eclipse:eclipse

pra nao perder este ultimo benefício, vou configurar o pom.xml para copiar as depencias automaticamente para o WEB-INF/lib quando executar o mvn eclipse:eclipse

valeu pelo suporte! :smiley:

abraços!

Daniel

Lucas_Cavalcanti

antes de vc fazer isso com seu pom.xml, vc configurou o plugin do eclipse no pom falando que o seu projeto eh wtp?

se vc não fizer isso o maven cria como se fosse um projeto normal, e não exporta as coisas pro lugar certo…

<plugin>
                                <artifactId>maven-eclipse-plugin</artifactId>
                                <version>2.8</version>
                                <configuration>
                                        <downloadSources>true</downloadSources>
                                        <downloadJavadocs>true</downloadJavadocs>
                                        <wtpversion>2.0</wtpversion>
                                </configuration>
                        </plugin>

outra coisa: se vc quiser rodar o VRaptor com o mvn jetty:run, vc precisa colocar essa linha no seu pom:

<build>
     .....   <outputDirectory>${basedir}/src/main/webapps/WEB-INF/classes</outputDirectory>
     ....
</build>
D

Oi Lucas,
obrigado por responder novamente :smiley:

então… nao cheguei a configurar o pom.xml dizendo que ele é um projeto wtp… mas quando eu executava assim: mvn -Dwtpversion=R7 eclipse:eclipse. Nao sei se com o parametro -Dwtpversion faz o mesmo efeito, mas pra grantir e tb pra deixar o pom.xml mais padronizado, vou seguir seu conselho e configurar o maven-eclipse-plugin.

sobre o mvn jetty:run no começo eu usava assim… mas abandonei pois queria o console do servidor dentro do eclipse… e não num terminal do SO…
talvez dê pra fazer isso usando o plugin M2Eclipse… mas eu nao gosto muito daquele plugin nao… hehehe

valeu!
abraços!

Criado 20 de setembro de 2010
Ultima resposta 21 de set. de 2010
Respostas 10
Participantes 3