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

Eu acabei criando no forum errado… :oops:

Boa noite!

Eu estou tentando fazer um CRUD usando ajax para persistir.
Eu tenho essa action:

[code]@Post("/user/save/")
public void save(User obj) {
this.logger.debug(obj.toString());

	result.use(Results.status()).ok();
}[/code]

A entidade User:

[code]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
}[/code]
E eu faço um $.ajax passando os valores dos inputs que ficam assim:

{obj.email: "admin@frontend.com.br", 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!

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?

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…

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.

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, 

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…

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

"obj.email": "admin@frontend.com.br"
"obj.groups[0]": 1
"obj.groups[1]": 2
"obj.groups[2]": 3
"obj.id": "1"
"obj.name": "ADMINISTRATOR"
"obj.status": "ATIVO"
"obj.username": "admin"