[Resolvido] VRaptor - Enum e BigDecimal ao criar DTO

Estou com uma estrutura simples:

@Post("/account/new") public void insert(AccountDTO dto){

Onde o AccountDTO tem um construtor assim:

	public AccountDTO(String hash, String description, Icon icon, BigDecimal initialBalance,
			Portfolio portfolio, AccountType accountType) {

e tenho meus inputs…

									<input class="span6" type="text" name="dto.description">
											
									<select class="chzn-select" name="dto.icon">
										<c:forEach items="${icons}" var="icon">
								       		<option value="${icon}" class="${icon.cssClass}" >${i18n[icon.label]}</option>
										</c:forEach>								
									</select>

									<select name="dto.accountType" class="chzn-select">
										<c:forEach items="${accountTypes}" var="type">
											<option value="${type}">${i18n[type.label]}</option>
										</c:forEach>
									</select>									

									<input class="span4" type="text"  name="dto.initialBalance">									

								<input type="hidden" name="dto.portfolio">							
								<input type="hidden" name="dto.hash">			

ai explode uma exception no console:


Jun 28, 2013 6:34:23 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [default] in context with path [/m] threw exception
br.com.caelum.vraptor.http.InvalidParameterException: Exception when trying to instantiate Target(name=dto, type=class com.m.model.dto.AccountDTO)
	at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.handleException(VRaptorInstantiator.java:96)
	at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.handleException(VRaptorInstantiator.java:98)
	at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.instantiate(VRaptorInstantiator.java:88)
	at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.instantiate(VRaptorInstantiator.java:81)
	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:132)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:86)
	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.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.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.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:67)
	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.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	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.guice.GuiceProvider.provideForRequest(GuiceProvider.java:82)
	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 net.vidageek.i18n.filter.I18nFilter.doFilter(I18nFilter.java:44)
	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:222)
	at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:123)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.__invoke(StandardHostValve.java:171)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: com.google.inject.ConfigurationException: Guice configuration errors:

1) No implementation for com.m.model.enums.Icon was bound.
  while locating com.m.model.enums.Icon

1 error
	at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)
	at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.google.inject.JrInjectorProxy.invoke(JrInjectorProxy.java:68)
	at com.google.inject.Injector_$$_javassist_0.getProvider(Injector_$$_javassist_0.java)
	at br.com.caelum.vraptor.ioc.guice.GuiceProvider$GuiceContainer.canProvide(GuiceProvider.java:67)
	at br.com.caelum.vraptor.http.iogi.VRaptorDependencyProvider.canProvide(VRaptorDependencyProvider.java:44)
	at br.com.caelum.iogi.DependenciesInjector.canObtainDependenciesFor(DependenciesInjector.java:21)
	at br.com.caelum.iogi.reflection.ClassConstructor.canInstantiateOrInject(ClassConstructor.java:90)
	at br.com.caelum.iogi.reflection.Constructors.compatibleWith(Constructors.java:33)
	at br.com.caelum.iogi.ObjectInstantiator.instantiate(ObjectInstantiator.java:30)
	at br.com.caelum.iogi.MultiInstantiator.instantiate(MultiInstantiator.java:20)
	at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.instantiate(VRaptorInstantiator.java:86)
	... 49 more

Ideias ?

**EDIT

tirei o Icon do construtor e do request, ai deu um erro reclamando do BigDecimal, um erro bem parecido, mas já dei clean no console e perdi
a exception… Mas uma coisa de cada vez né ? haahah
O que será que estou fazendo de errado?

Icon é uma enum mesmo?

Lucas, é sim:

public enum Icon implements Translatable {
	GLASS, LEAF, DOG, USER, GIRL, CAR; //mais uns trocentos
      
	public String getCssClass() {
		return "icon-" + name().toLowerCase().replace("_", "-");
	}

	@Override
	public String getLabel() {
		return "icon." + name().toLowerCase().replace("_", ".");
	}

EDIT

Será que tem algo com o IOGI ?
Versão: 0.9.2

versão do VRatpr 3.5.1

Estou usando o gradle…
e tenho apenas:

	compile library.vraptor  

num arquivo eu seto no libarry:

ext.library['vraptor'] = "br.com.caelum:vraptor:3.5.1"

Obrigado

Tenta tirar o implements Translatable… em todo caso é bem estranho…

qual é o erro que dá qdo vc tira ele do construtor?

Aí da erro no BigDecimal:

[code]1) Could not find a suitable constructor in java.math.BigDecimal. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
at java.math.BigDecimal.class(Unknown Source)
while locating java.math.BigDecimal

1 error
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[/code]

Aí, fazendo o teste sem o BigDecimal, da erro no Outro enum AccountType

[code]1) No implementation for com.m.model.enums.AccountType was bound.
while locating com.m.model.enums.AccountType

1 error
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
[/code]

Onde:

public enum AccountType implements Translatable {
	
	CHECKING, SAVINGS, INVESTMENT;

	@Override
	public String getLabel() {
		return "account.type." + name().toLowerCase();
	}

Tirando esse Enum da requisição,
temos: SUCESS! x]

Ou seja, sem Enum e sem BigDecimal funciona… Mas aí meu construtor final ficou peladin peladin oia só:

public SaveableAccount(String hash, String description, Portfolio portfolio) {

Duas Strings e um Portfolio (no qual possuo um converter).

Complica né ?

Com certeza deve ter alguma coisa de errado né Lucas?
Não faz sentido :frowning:

vou tirar o translateble dos enums e vou tentar de novo e já posto o resultado

EDIT

Da o mesmo erro :frowning:

populando via setter funciona tranquilo?

Cara, eu removi o construtor e coloquei os setters…
e funcionou… *Alias, deu erro, mas de persistencia… sinal que funcionou! kkkkkkkk

Aí eu deixei o construtor + os setters…e deu o mesmo erro no Enum…
Estranho isso!!

cara o engraçado é que tem outros lugares que uso objetos imutaveis, sem contar que sem o bigdecimal e os enums, funcionou…

tem alguma ideia?

Parece um bug no IOGI… só pra confirmar: se vc deixar um construtor sem o bigdecimal e os enums e setters pra eles dá o erro do enum, certo?

Cara, deu erro de persistência, mas veja só::

O que implica que o accountType esta null…

bom, debugando…

cara, não setou nada!
apenas o Portfolio !!

EDIT

Opa, nem o Portfolio setou…
foi uma instancia default do portfolio…
¬¬

tem boi na linha no meu post!

ele chega a dar algum erro de conversão? antes de mandar pra salvar no banco de dados checa o validator.getErrors() e veja se ele tá vazio.

AAAAAAAAARG…

O problema era o POST… tava fazendo burrice e o form não estava sendo serializado!!
Esta funcionando perfeitamente o IOGI…

Mas é foda… a msg de erro me fez pensar em TUDO, menos olhar o request!
afffffff
burrice minha também…

obrigado Lucas,
desculpa cara =[

sem problemas… mas pra dar esse erro alguma coisa foi pro request… bem estranho.