VRaptor Converter de String vazia para NULL

13 respostas
rafaelbtz

Salve galera,

estou com um problema que achei que era simples de resolver mas não to conseguindo.

Eu preciso que em minha aplicação, todo input que esteja VAZIO tenha o valor no Java definido para NULL
Então fiz o que eu achei mais lógico, um Converter.

mas não funciona. Eu debugo o converter mas ele não é executado:

@Convert(String.class)
@ApplicationScoped
public class StringConverter implements Converter<String> {
	public String convert(String value, Class<? extends String> type, ResourceBundle bundle) {
		if (value == null || value.equals(""))return null;

		return value.trim();
	}
}

Ja fucei na internet mas não achei a solução, alguém sabe como fazer?

Obrigado.

13 Respostas

JuniorMaia

o fato de tu estar usando o value.equals(""), fará com que a string fique vazia, pedendo dar problema no teu banco, nunca me deparei com esta situação, porém, eu atribuiria uma caracter qualquer e trataria o mesmo na aplicação como “nullo”, é uma ideia…

Lucas_Cavalcanti

Qual versão do vraptor vc tá usando?
IOGI ou OGNL? (pelas libs que estão no classpath)

rafaelbtz

No lib tem:
vraptor-3.4.0.jar e ognl-2.7.3.jar

rafaelbtz

Junior valeu pela resposta, mas pra falar a verdade não entendi bem que você quis dizer, mas esse value.equals("") só está testando o valor vindo da request, mas o problema é um pouco mais em baixo, pois o código do Converter não é executado.

Lucas_Cavalcanti

bom, possivelmente o OGNL não use o String converter…

vc pode tentar usar o iogi, removendo o jar do ognl, colocando o jar do iogi e registrando o pacote do iogi no web.xml… acho que funciona.

rafaelbtz

Valeu Lucas, mas acho que estou fazendo alguma coisa errada.

Retirei o ognl-2.7.3.jar da pasta lib e coloquei o iogi-0.9.1.jar

No WEB.XML adicionei o seguinte:

<context-param>
  <param-name>br.com.caelum.vraptor.packages</param-name>
  <param-value>br.com.caelum.iogi</param-value>
</context-param>

e estou recebendo o seguinte erro ao subir o tomcatm reclamando de falta de uma classe do OGNL que eu removi

java.lang.NoClassDefFoundError: ognl/TypeConverter
	at java.lang.Class.getDeclaredMethods0(Native Method)
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
	at java.lang.Class.getDeclaredMethods(Class.java:1791)
	at org.springframework.core.type.StandardAnnotationMetadata.hasAnnotatedMethods(StandardAnnotationMetadata.java:136)
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.checkConfigurationClassCandidate(ConfigurationClassBeanDefinitionReader.java:318)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:172)
	at org.zeroturnaround.javarebel.integration.spring.annotations.ConfigurationReloaderSpring3.runPostProcessor(ConfigurationReloaderSpring3.java:26)
	at org.zeroturnaround.javarebel.integration.spring.SpringBeanReloader.reloadBeanDefinitionsInternal(SpringBeanReloader.java:428)
	at org.zeroturnaround.javarebel.integration.spring.SpringBeanReloader.reloadBeanDefinitions(SpringBeanReloader.java:404)
	at org.zeroturnaround.javarebel.integration.spring.SpringBeanReloader.doCheckAndReloadBeanDefinitions(SpringBeanReloader.java:378)
	at org.zeroturnaround.javarebel.integration.spring.SpringBeanReloader.checkAndReloadBeanDefinitions(SpringBeanReloader.java:363)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.containsBeanDefinition(DefaultListableBeanFactory.java)
	at org.springframework.beans.factory.support.AbstractBeanFactory.containsLocalBean(AbstractBeanFactory.java:617)
	at org.springframework.context.support.AbstractApplicationContext.initLifecycleProcessor(AbstractApplicationContext.java:814)
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:905)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:428)
	at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.start(SpringBasedContainer.java:106)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.start(SpringProvider.java:87)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:110)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:103)
	at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:277)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:103)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4638)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5294)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1568)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1558)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	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:662)
Caused by: java.lang.ClassNotFoundException: ognl.TypeConverter
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1701)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
Lucas_Cavalcanti

volta com o jar do ognl, e o pacote pra adicionar não é o que vc pôs, é esse:

br.com.caelum.vraptor.http.iogi
rafaelbtz

Lucas, agora funcionou. Valeu.

Só uma dúvida pra eu entender melhor,
debugando o Converter ele não passa por la.
Isso que dizer que o IOGI ja transforma String vazia em NULL sem precisar de Converters?

Lucas_Cavalcanti

sim, é o comportamento padrão do iogi se eu não me engano.

A

Hum… então quer dizer que o StringConverter nunca é usado?

Estou fazendo um projeto com Vraptor 3.4.0 utilizando o Iogi e este post tinha me dado uma boa idéia.

Coloquei como teste para ele sempre retornar a String em maiusculo, mas não funcionou.

Imaginei que Strings não precisassem de conversão por já serem o tipo que vem no request.
Mas como tem uma classe StringConverter nativa no framework, imaginei que isso foi considerado.

Tem como fazer o framework chamar esse Conveter?

rafaelbtz

Eu até removi meu converter do projeto e as Strings continuam vindo como eu queria, realmente o @Converter(String.class) não é chamado.

Lucas_Cavalcanti

AbelBueno,

o VRaptor não chama o StringConverter simplesmente pq não tem mto porque converter de String para String…

se vc tem um dado específico que precisa transformar tudo pra maiúsculo, vc sempre pode fazer isso no setter:

public void setCoisa(String coisa) {
    if (coisa != null) coisa = coisa.toUpperCase();
    this.coisa = coisa;
}
A

Lucas Cavalcanti:
AbelBueno,

o VRaptor não chama o StringConverter simplesmente pq não tem mto porque converter de String para String…

Obrigado Lucas.

Foi a primeira coisa que pensei ao ver o tópico: já vem String no request, não precisaria conversão.

É que como tem uma StringConverter nativa lá, imaginei que mesmo strings caissem nesse fluxo.

O que eu queria era um pouco mais complexo do que tornar maiusculo, foi só um exemplo.
De qualquer forma, encontrei outra solução mais viável. Obrigado.

Criado 16 de maio de 2012
Ultima resposta 22 de mai. de 2012
Respostas 13
Participantes 4