Enum auto converter funciona?

12 respostas
Lucas_Cavalcanti

acabei de testar aqui com um enum qualquer e funcionou…

tem certeza que o erro deu por causa do enum?

Vc tá referenciando o enum pela classe do enum mesmo?

12 Respostas

Lucas_Cavalcanti

a propriedade que vc quer setar é advogado.endereco.estado…
esse erro pode ter acontecido ao tentar instanciar advogado, ou endereco ou estado… algum deles não tem construtor padrão? ou tem alguma coisa de diferente?

Lucas_Cavalcanti

posta a classe UnidadeFederacao plz

Lucas_Cavalcanti

usando exatamente essa classe funcionou aqui…

tenta receber a UF direto no método do controller…

public void save(..., UnidadeFederacao uf) {...}

e no select

<select name="uf">

exatamente isso funcionou aqui…

Lucas_Cavalcanti

então… não precisa receber a enum no método e não deve fazer isso… funciona dentro de uma classe tb…

sempre que o tipo desejado é uma enum, mesmo no grafo da entidade, ele usa o converter de enum…

eu pedi pra vc testar de colocar num método pra entender melhor o problema…

Nos seus getters e setters vc tá referenciando o tipo exato da enum?

aqui eu criei:

public class AAA {
	private UnidadeFederacao teste;

	public void setTeste(UnidadeFederacao teste) {
		this.teste = teste;
	}

	public UnidadeFederacao getTeste() {
		return teste;
	}
}

recebi isso no método e tb funcionou…

Lucas_Cavalcanti

sim, é possível… se funciona no primeiro nível, funciona em todos os outros…

e o enum como atributo e getters e setters têm que estar dentro das entidades mesmo, não no controller

G

Só para acrescentar, eu uso muitos enums em meus projetos e todos funcionam muito bem com o vraptor, tanto como propriedades na classe como enviando como parametro do método.

Meus enums são da mesma forma que o seu, usando no caso um chave e valor. Estou usando vraptor 3.1, porém desde o 3.0-beta tem funcionando muito bem.

Analisando tuas classes, você está usando advogado.endereco.estado como nome do campo. Teu método possui o advogado como parametro e esse objeto possui mesmo um endereco.estado, sendo esse estado o enum?

Qual o valor que você está imprimindo em ${uf}? Será que está mesmo sendo impresso RS ou “Rio Grande do Sul”? Caso for o segundo creio que a injeção não funcione, pois a inicialização dos enums é via Enum.name().

Abraços

seufagner

Tenho uma entidade, digamos Pessoa, com uma enum com o nome UnidadeFederacao. O VRaptor não consegue preencher o parâmetro com o valor vindo do formulário, pois, pelo trace, ele está tentando criar uma instância da enum via construtor… 8|

Como faço para passar um bean, contendo uma enum como atributo, como argumento para o método do controller?

JSP

select name="advogado.endereco.estado" name="advogado.endereco.estado" class="input-select"> <c:forEach var="uf" items="${listUF}"> <option value="${uf}">${uf}</option> </c:forEach> </select>

stack

2010-01-31 14:26:48.143::WARN: /juriprev/advogado/save br.com.caelum.vraptor.http.InvalidParameterException: Unable to find the correct constructor at br.com.caelum.vraptor.http.ognl.ReflectionBasedNullHandler.nullPropertyValue(ReflectionBasedNullHandler.java:98) at ognl.ASTProperty.getValueBody(ASTProperty.java:118) at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) at ognl.SimpleNode.getValue(SimpleNode.java:236) at ognl.ASTChain.setValueBody(ASTChain.java:222) at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220) at ognl.SimpleNode.setValue(SimpleNode.java:279) at ognl.Ognl.setValue(Ognl.java:737) at ognl.Ognl.setValue(Ognl.java:783) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:133) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:108)

seufagner

Sim, estou passando um lista de instancias para o JSP via UnidadeFederacao.values()

Iterando no JSP:

<select name="advogado.endereco.estado" class="input-select"> <c:forEach var="uf" items="${listUF}"> <option value="${uf}">${uf}</option> </c:forEach>

stack inteira

2010-01-31 16:01:11.527::WARN: /juriprev/advogado/save br.com.caelum.vraptor.http.InvalidParameterException: Unable to find the correct constructor at br.com.caelum.vraptor.http.ognl.ReflectionBasedNullHandler.nullPropertyValue(ReflectionBasedNullHandler.java:98) at ognl.ASTProperty.getValueBody(ASTProperty.java:118) at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) at ognl.SimpleNode.getValue(SimpleNode.java:236) at ognl.ASTChain.setValueBody(ASTChain.java:222) at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220) at ognl.SimpleNode.setValue(SimpleNode.java:279) at ognl.Ognl.setValue(Ognl.java:737) at ognl.Ognl.setValue(Ognl.java:783) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:133) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:108) at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:90) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:83) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:68) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42) at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:46) at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:365) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:211) at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) at org.mortbay.jetty.Server.handle(Server.java:285) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:502) at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:835) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:641) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:208) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:378) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:368) at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442) Caused by: java.lang.NoSuchMethodException: br.com.atttecnologia.juriprev.model.common.UnidadeFederacao.<init>() at java.lang.Class.getConstructor0(Class.java:2678) at java.lang.Class.getDeclaredConstructor(Class.java:1953) at br.com.caelum.vraptor.http.ognl.GenericNullHandler.instantiate(GenericNullHandler.java:70) at br.com.caelum.vraptor.http.ognl.ReflectionBasedNullHandler.nullPropertyValue(ReflectionBasedNullHandler.java:79) ... 53 more

seufagner

Exatamente.

Todos eles tem o construtor padrão indiretamente, já que não possui nenhum outro (o compilador gera pra mim o contrutor default).

seufagner
/**
 * 
 * Representa um estado da federação.
 * 
 * 
 * @author [email removido]
 * 
 */
public enum UnidadeFederacao {

	AC("Acre"), AL("Alagoas"), AM("Amazonas"), AP("Amapá"), BA("Bahia"), CE("Ceará"), DF("Distrito Federal"), ES("Espírito Santo"), GO(
			"Goiás"), MA("Maranhão"), MG("Minas Gerais"), MS("Mato Grosso do Sul"), MT("Mato Grosso"), PA("Pará"), PR("Paraná"), PB(
			"Paraíba"), PE("Pernambuco"), PI("Piauí"), RJ("Rio de Janeiro"), RN("Rio Grande do Norte"), RS("Rio Grande do Sul"), RO(
			"Rondônia"), RR("Roraima"), SC("SantaCatarina"), SP("SãoPaulo"), SE("Sergipe"), TO("Tocantins");

	private String descricao;

	UnidadeFederacao(String descricao) {
		this.descricao = descricao;
	}

	public String descricao() {
		return this.descricao;
	}

}
seufagner

entendi… entao é uma exigencia do VRaptor?

ele deve usar os conversores quando injeta no metodo exatamente o tipo da enum. é isso?

agora imagina uma entidade que tem uns 7 enums diferentes? vou declarar todos no metodo?

estou divagando aqui sobre como o vraptor se comporta, populando o bean. ele vai aplicando conversores ao navegar no grafo da entidade? ou quando injeta no metodo?

seufagner

entendi… mas aí cai no mesmo problema das “7 enums” que citei… eu teria que ter as 7 enums declaradas como atributo e seus getters e setters tambem, e dentro de cada metodo que va utiliza-las eu ter que dar um set na entidade que as contem com o valor capturado do jsp.

não é possível eu declarar apenas a entidade Advogado? que tem Endereco e por sua vez a famigerada UnidadeFederacao ?

Criado 31 de janeiro de 2010
Ultima resposta 31 de jan. de 2010
Respostas 12
Participantes 3