[Resolvido][VRaptor] InvalidParameterException: Exception when trying to instantiate Target

6 respostas
Rafael_Guerreiro

Eu acabei criando no forum errado... :oops:

Boa noite!

Eu estou tentando fazer um CRUD usando ajax para persistir. Eu tenho essa action:
@Post("/user/save/")
	public void save(User obj) {
		this.logger.debug(obj.toString());
		
		result.use(Results.status()).ok();
	}
A entidade User:
public class User implements DataTables {

	@Id
	@Column(name = "USER_ID")
	private Long id;

	@Column(name = "NAME", nullable = false, length = 100)
	private String name;

	@Column(name = "PASSWORD", nullable = false, length = 20)
	private String password;

	@Column(name = "EMAIL", nullable = false, unique = true, length = 200)
	private String email;

	@Column(name = "LANGUAGE", nullable = false, length = 2, columnDefinition = "char")
	private String language;

	@Column(name = "USER_LOGIN", nullable = false, unique = true, length = 50)
	private String username;

	@Enumerated(EnumType.STRING)
	@Column(name = "STATUS", nullable = false, length = 20)
	private Status status;

	@JoinTable(name = "W_USER_GROUP", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "GROUP_ID"), schema = "U_FRONTEND")
	@ManyToMany
	private List<UserGroup> groups;

	@Column(name = "UPD_USER", nullable = false, length = 50)
	private String updUser;

	@Column(name = "UPD_DATE", nullable = false, columnDefinition = "date")
	private Calendar updDate;
// Getters e setters
}
E eu faço um $.ajax passando os valores dos inputs que ficam assim:
{obj.email: "[email removido]",
obj.groups[0]: 1,
obj.groups[1]: 2,
obj.groups[2]: 3,
obj.id: "1",
obj.name: "ADMINISTRATOR",
obj.status: "ATIVO",
obj.username: "admin"}
Eu tenho um UserGroupConverter que recebe o id do grupo e já retorna todo o objeto.

Não consigo encontrar o motivo dessa stack trace. Pelo o que eu procurei na internet, isso é um erro conhecido na versão 3.3.1 mas eu só vi casos onde usavam Upload...

Essa é a Stack Trace:
br.com.caelum.vraptor.http.InvalidParameterException: Exception when trying to instantiate Target(name=obj, type=class hamburgsud.frontend.model.User)
	at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.handleException(VRaptorInstantiator.java:95)
	at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.instantiate(VRaptorInstantiator.java:87)
	at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.instantiate(VRaptorInstantiator.java:80)
	at br.com.caelum.vraptor.http.iogi.IogiParametersProvider.instantiateOrAddError(IogiParametersProvider.java:80)
	at br.com.caelum.vraptor.http.iogi.IogiParametersProvider.instantiateParameters(IogiParametersProvider.java:73)
	at br.com.caelum.vraptor.http.iogi.IogiParametersProvider.getParametersFor(IogiParametersProvider.java:63)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:126)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:83)
	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.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.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	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.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.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:91)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	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:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	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:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	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:680)
Caused by: java.lang.NullPointerException
	at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator$VRaptorTypeConverter.setPropertiesAfterConversions(VRaptorInstantiator.java:143)
	at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator$VRaptorTypeConverter.instantiate(VRaptorInstantiator.java:134)
	at br.com.caelum.iogi.MultiInstantiator.instantiate(MultiInstantiator.java:20)
	at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.instantiate(VRaptorInstantiator.java:85)
	... 42 more

Obrigado!

6 Respostas

fredericomaia10

Então, estou começando com VRaptor mas vamos tentar.

Esse groups que você está informando 1, 2 e 3 estão estranhos já que o que você tem na entidade User é um List de UserGroup. O que é a entidade UserGroup?

Rafael_Guerreiro

Ah, mas eu tenho um converter de UserGroup, ou seja, ele recebe um String e tenta encontrar um UserGroup, assim:

@Convert(UserGroup.class)
public class UserGroupConverter implements Converter<UserGroup> {
	private final Logger logger = LoggerFactory.getLogger(this.getClass());
	private UserGroupDAO dao;

	public UserGroupConverter(UserGroupDAO dao) {
		this.dao = dao;
	}

	@Override
	public UserGroup convert(String value, Class<? extends UserGroup> type,
			ResourceBundle bundle) {
		try {
			return dao.get(Long.parseLong(value));
		} catch (NumberFormatException e) {
			logger.error("Unable to convert to long. Value: '" + value + "'", e);
		} catch (HibernateException e) {
			logger.error("Unable to get this record. Value: '" + value + "'", e);
		} catch (Exception e) {
			logger.error("An error occured. Value: '" + value + "'", e);
		}
		return null;
	}
}

Se ele passasse pelo converter e desse erro, ele me mostraria no log e retornaria null… O que não é o caso.

Eu ainda estou sem entender esse erro estranho…

Rafael_Guerreiro

Eu tive um avanço mas eu estou sem entender:

Eu retirei esses 3 atributos do meu data:

obj.groups[0]: 1, obj.groups[1]: 2, obj.groups[2]: 3,
E funcionou. Acho que eu estou passando lista da forma errada, eu deveria passar como um Array, certo?

Vou tentar.

Lucas_Cavalcanti

deveria passar assim sim… mas vc tem que usar entre aspas se tá passando no $.ajax:

"obj.groups[0]": 1,    
"obj.groups[1]": 2,    
"obj.groups[2]": 3,
Rafael_Guerreiro

Na verdade eu tinha me enganado, ele não funcionou… Eu já estou passando esses valores como String…

Eu preciso passar as aspas implicitamente? Vou tentar fazer isso…

Rafael_Guerreiro

Genial! Com as aspas dentro da String funcionou, então ficou assim:

"obj.email": "[email removido]"
"obj.groups[0]": 1
"obj.groups[1]": 2
"obj.groups[2]": 3
"obj.id": "1"
"obj.name": "ADMINISTRATOR"
"obj.status": "ATIVO"
"obj.username": "admin"
Criado 13 de janeiro de 2013
Ultima resposta 14 de jan. de 2013
Respostas 6
Participantes 3