Olá pessoal gostaria de saber com tratar erro de tipo de obejeto da view.
Tratar datas(27/09/2010),valor decimal(1.000,00).
Li o material dos conversores mas não entendi como aplicar.
vlw
Olá pessoal gostaria de saber com tratar erro de tipo de obejeto da view.
Tratar datas(27/09/2010),valor decimal(1.000,00).
Li o material dos conversores mas não entendi como aplicar.
vlw
Você não trata nada, quem faz isso é o Vraptor.
Basta você adicionar no seu web.xml:
<context-param>
<param-name>br.com.caelum.vraptor.packages</param-name>
<param-value>br.com.caelum.vraptor.converter.l10n</param-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
<param-value>pt_BR</param-value>
</context-param>
E no seu código basta você receber os valores com o tipo correto:
public void foo(Date nascimento) {
[...]
}
Opa!
Para converter os números vc pode adicionar ao seu web.xml esta configuração:
<context-param>
<param-name>br.com.caelum.vraptor.packages</param-name>
<param-value>br.com.caelum.vraptor.converter.l10n</param-value>
</context-param>
Na JSP vc pode colocar uma máscara JQuery para que os valores sejam digitados 27/10/2010 e 25.000,00, lembrando que vc deve usar jstl na JSP:
// formatando Moeda
<input id="real" name="produto.valor" type="text" value="<fmt:formatNumber value="${produto.valor}" minFractionDigits="2"/>" />
// formatando Data
<input id="data" name="produto.dataInclusao" type="text" value="<fmt:formatDate pattern='dd/MM/yyyy' value="${produto.dataInclusao }"/>"/></input>
Abraço!
Opa!
Para converter os números vc pode adicionar ao seu web.xml esta configuração:<context-param> <param-name>br.com.caelum.vraptor.packages</param-name> <param-value>br.com.caelum.vraptor.converter.l10n</param-value> </context-param>Na JSP vc pode colocar uma máscara JQuery para que os valores sejam digitados 27/10/2010 e 25.000,00, lembrando que vc deve usar jstl na JSP:
// formatando Moeda <input id="real" name="produto.valor" type="text" value="<fmt:formatNumber value="${produto.valor}" minFractionDigits="2"/>" /> // formatando Data <input id="data" name="produto.dataInclusao" type="text" value="<fmt:formatDate pattern='dd/MM/yyyy' value="${produto.dataInclusao }"/>"/></input>Abraço!
se vc estiver com o locale pt_BR, sim
Coloquei no web.xml mas não está convertendo.
vc chegou a adicionar isso no web.xml?
<context-param>
<param-name>br.com.caelum.vraptor.packages</param-name>
<param-value>br.com.caelum.vraptor.converter.l10n</param-value>
</context-param>
vc chegou a adicionar isso no web.xml?
<context-param> <param-name>br.com.caelum.vraptor.packages</param-name> <param-value>br.com.caelum.vraptor.converter.l10n</param-value> </context-param>
Adicionei.
Quando eu envio no log não aparece nada sobre converter.
Não precisa anotar nada na classe?
cuidado que o final é L dez N, e não cento e dez N
habilita o log de debug do vraptor, e veja se ao iniciar a aplicação aparece algum converter do pacote br.com.caelum.vraptor.converter.l10n…
de qqer forma, qual é o tipo que o produto.setValor() recebe?
cuidado que o final é L dez N, e não cento e dez Nhabilita o log de debug do vraptor, e veja se ao iniciar a aplicação aparece algum converter do pacote br.com.caelum.vraptor.converter.l10n…
de qqer forma, qual é o tipo que o
produto.setValor()recebe?
No log está scanneando
13:50:51,897 DEBUG [ComponentScanner ] scanning [br.com.caelum.vraptor.converter.l10n]
13:50:51,908 INFO [DefaultListableBeanFactory] Overriding bean definition for bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor': replacing [Root bean: class [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] with [Root bean: class [br.com.caelum.vraptor.ioc.spring.InjectionBeanPostProcessor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]
13:50:51,915 DEBUG [VRaptorApplicationContext] Bean factory for Root WebApplicationContext: org.springframework.beans.factory.support.DefaultListableBeanFactory@1ba614a: defining beans [XStreamXMLDeserializer,asmBasedTypeCreator,defaultConverters,objenesisProxifier,defaultMultipartConfig,encodingHandlerFactory,defaultAcceptHeaderToFormat,defaultRouter,defaultTypeNameExtractor,defaultDeserializers,defaultRoutes,defaultTypeFinder,defaultMethodNotAllowedHandler,defaultResourceTranslator,defaultResourceNotFoundHandler,pathAnnotationRoutesParser,defaultInterceptorRegistry,emptyElementsRemoval,noRoutesConfiguration,paranamerNameProvider,stereotypeHandler,converterHandler,interceptorStereotypeHandler,deserializesHandler,stereotypedBeansRegistrar,defaultSpringLocator,applicationConfiguration,downloadInterceptor,defaultResult,defaultRepresentationResult,defaultRefererResult,multipartInterceptor,XStreamJSONSerialization,jstlLocalization,deserializingInterceptor,XStreamXMLSerialization,forwardToDefaultViewInterceptor,flashInterceptor,defaultValidator,parametersInstantiatorInterceptor,defaultStatus,defaultValidationViewsFactory,executeMethodInterceptor,emptyResult,defaultPageResult,ognlParametersProvider,defaultPathResolver,replicatorOutjector,defaultLogicResult,instantiateInterceptor,defaultFormatResolver,defaultHttpResult,defaultMethodInfo,interceptorListPriorToExecutionExtractor,resourceLookupInterceptor,outjectResult,bigDecimalConverter,bigIntegerConverter,booleanConverter,byteConverter,characterConverter,doubleConverter,enumConverter,floatConverter,integerConverter,localeBasedCalendarConverter,localeBasedDateConverter,longConverter,primitiveBooleanConverter,primitiveByteConverter,primitiveCharConverter,primitiveDoubleConverter,primitiveFloatConverter,primitiveIntConverter,primitiveLongConverter,primitiveShortConverter,shortConverter,uploadedFileConverter,VRaptorRequestProvider,httpServletRequestProvider,httpServletResponseProvider,httpSessionProvider,localDateConverter,localTimeConverter,defaultInterceptorStack,defaultRequestExecution,categoriasController,cepController,familiasController,fornecedoresController,multiEansController,nfEntradaController,nutricaoController,parametrosController,produtosController,receitasController,usuariosController,categoriaDao,cstADao,divisaoDao,embCompraDao,embRecebimentoDao,embVendaDao,familiaDao,figuraFiscalDao,grupoDao,impostoDao,logbairroDao,log_faixa_ufDao,log_logradouroDao,lojaDao,marcaDao,multiEanDao,nutricaoDao,pisCofinsDao,produtoDao,produtoEanDao,produtoLojaDao,produtoPesadoDao,produtoRapidoDao,receitaDao,secaoDao,setorCustoDao,setorDao,subGrupoDao,tipoEmbalagemDao,tipoProdutoDao,usuarioDao,criadorDeSession,criadorDeSessionFactory,autorizacaoInterceptor,usuarioWeb,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.aop.config.internalAutoProxyCreator,cacheBasedTypeCreator]; root of factory hierarchy
13:50:52,289 DEBUG [VRaptorApplicationContext] Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@1a6b028]
13:50:52,292 DEBUG [VRaptorApplicationContext] Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@772046]
13:50:52,303 INFO [DefaultListableBeanFactory] Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1ba614a: defining beans [XStreamXMLDeserializer,asmBasedTypeCreator,defaultConverters,objenesisProxifier,defaultMultipartConfig,encodingHandlerFactory,defaultAcceptHeaderToFormat,defaultRouter,defaultTypeNameExtractor,defaultDeserializers,defaultRoutes,defaultTypeFinder,defaultMethodNotAllowedHandler,defaultResourceTranslator,defaultResourceNotFoundHandler,pathAnnotationRoutesParser,defaultInterceptorRegistry,emptyElementsRemoval,noRoutesConfiguration,paranamerNameProvider,stereotypeHandler,converterHandler,interceptorStereotypeHandler,deserializesHandler,stereotypedBeansRegistrar,defaultSpringLocator,applicationConfiguration,downloadInterceptor,defaultResult,defaultRepresentationResult,defaultRefererResult,multipartInterceptor,XStreamJSONSerialization,jstlLocalization,deserializingInterceptor,XStreamXMLSerialization,forwardToDefaultViewInterceptor,flashInterceptor,defaultValidator,parametersInstantiatorInterceptor,defaultStatus,defaultValidationViewsFactory,executeMethodInterceptor,emptyResult,defaultPageResult,ognlParametersProvider,defaultPathResolver,replicatorOutjector,defaultLogicResult,instantiateInterceptor,defaultFormatResolver,defaultHttpResult,defaultMethodInfo,interceptorListPriorToExecutionExtractor,resourceLookupInterceptor,outjectResult,bigDecimalConverter,bigIntegerConverter,booleanConverter,byteConverter,characterConverter,doubleConverter,enumConverter,floatConverter,integerConverter,localeBasedCalendarConverter,localeBasedDateConverter,longConverter,primitiveBooleanConverter,primitiveByteConverter,primitiveCharConverter,primitiveDoubleConverter,primitiveFloatConverter,primitiveIntConverter,primitiveLongConverter,primitiveShortConverter,shortConverter,uploadedFileConverter,VRaptorRequestProvider,httpServletRequestProvider,httpServletResponseProvider,httpSessionProvider,localDateConverter,localTimeConverter,defaultInterceptorStack,defaultRequestExecution,categoriasController,cepController,familiasController,fornecedoresController,multiEansController,nfEntradaController,nutricaoController,parametrosController,produtosController,receitasController,usuariosController,categoriaDao,cstADao,divisaoDao,embCompraDao,embRecebimentoDao,embVendaDao,familiaDao,figuraFiscalDao,grupoDao,impostoDao,logbairroDao,log_faixa_ufDao,log_logradouroDao,lojaDao,marcaDao,multiEanDao,nutricaoDao,pisCofinsDao,produtoDao,produtoEanDao,produtoLojaDao,produtoPesadoDao,produtoRapidoDao,receitaDao,secaoDao,setorCustoDao,setorDao,subGrupoDao,tipoEmbalagemDao,tipoProdutoDao,usuarioDao,criadorDeSession,criadorDeSessionFactory,autorizacaoInterceptor,usuarioWeb,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.aop.config.internalAutoProxyCreator,cacheBasedTypeCreator]; root of factory hierarchy
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
13:50:55,010 DEBUG [VRaptorApplicationContext] Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@d0cdd0]
13:50:55,085 INFO [DefaultConverters ] Registering bundled converters
13:50:55,085 DEBUG [DefaultConverters ] bundled converter to be registered: class br.com.caelum.vraptor.converter.BigDecimalConverter
13:50:55,085 DEBUG [DefaultConverters ] bundled converter to be registered: class br.com.caelum.vraptor.converter.BigIntegerConverter
13:50:55,085 DEBUG [DefaultConverters ] bundled converter to be registered: class br.com.caelum.vraptor.converter.BooleanConverter
13:50:55,085 DEBUG [DefaultConverters ] bundled converter to be registered: class br.com.caelum.vraptor.converter.ByteConverter
13:50:55,085 DEBUG [DefaultConverters ] bundled converter to be registered: class br.com.caelum.vraptor.converter.CharacterConverter
13:50:55,085 DEBUG [DefaultConverters ] bundled converter to be registered: class br.com.caelum.vraptor.converter.DoubleConverter
Quando adiciono passa os valores como estão na view(ex.1,1)
qual é o tipo que o produto.setValor() recebe?
Double
e que valor é colocado no produto.getValor()?
1,1
então não entendi qual é o problema… o valor não está correto?
Como tratar o valor que vem da view converter 1,1 para 1.1 e setar.
o VRaptor faz isso automaticamente…
faça na sua lógica:
System.out.println(produto.getValor());
o que ele imprime?
o VRaptor faz isso automaticamente…faça na sua lógica:
System.out.println(produto.getValor());o que ele imprime?
Ele imprimi 0.0
tire a configuração do l10n, e crie essa classe:
@Convert(Double.class)
public class CustomDoubleConverter extends Converter<Double> {
public Double convert(String value, ....) {
if (value == null || "".equals(value)) return 0.0;
return Double.valueOf(value.replace(".", "").replace(",", "."));
}
}
imports de br.com.caelum.vraptor
tire a configuração do l10n, e crie essa classe:Ficou assim mais não converteu. Por que a configuração do web.xml não funcionou ja que chega a inicializar conforme o log?imports de br.com.caelum.vraptor@Convert(Double.class) public class CustomDoubleConverter extends Converter<Double> { public Double convert(String value, ....) { if (value == null || "".equals(value)) return 0.0; return Double.valueOf(value.replace(".", "").replace(",", ".")); } }
import java.text.MessageFormat;
import java.util.ResourceBundle;
import br.com.caelum.vraptor.Convert;
import br.com.caelum.vraptor.Converter;
import br.com.caelum.vraptor.converter.ConversionError;
@Convert(Double.class)
public class CustomDoubleConverter implements Converter<Double>{
public Double convert(String value, Class<? extends Double> type, ResourceBundle bundle) {
if (value == null || value.equals("")) {
return null;
}
try {
return Double.parseDouble( value.replace(".","").replace(",",".") );
} catch (NumberFormatException e) {
throw new ConversionError(MessageFormat.format(bundle.getString("is_not_a_valid_number"), value));
}
}
}
acho q ele não tá passando pelos converters… tenta colocar um breakpoint ou um log no seu converter e vê se ele está sendo chamado…
pode ser que seja um problema com a ordem q o VRaptor tá registrando os converters…
vc tá usando q versão do VRaptor? que provider?
acho q ele não tá passando pelos converters… tenta colocar um breakpoint ou um log no seu converter e vê se ele está sendo chamado…pode ser que seja um problema com a ordem q o VRaptor tá registrando os converters…
vc tá usando q versão do VRaptor? que provider?
Ele não está passando pelo converters… vão direto para o hibernate validator… Estou usando versão 3.1
parece ser um bug então =(
no log de debug aparece um :
applying produto.valor with [1,1]
?
parece ser um bug então =(no log de debug aparece um :
applying produto.valor with [1,1]?
18:27:00,594 DEBUG [VRaptorApplicationContext] Cache miss for class br.com.caelum.vraptor.converter.PrimitiveIntConverter
18:27:00,587 DEBUG [VRaptorApplicationContext] Cache miss for class br.com.caelum.vraptor.converter.PrimitiveDoubleConverter
Porem não valida.
bom, o workaround pra agora seria transformar o produto.setValor(Double) pra produto.setValor(String) e converter na mão dentro do setter…
abri um bug pra investigar o que está acontecendo
Lucas, eu notei esse erro atualizando para a versão 3.2. Fiz um debug e os converters opcionais não estão sendo chamados, porém esse erro acontece apenas quando usamos o guice. No Spring não há esse erro.
cleison, vc tá usando o guice?
garcia, coloca isso lá na issue do bug, por favor?
cleison, vc tá usando o guice?garcia, coloca isso lá na issue do bug, por favor?
Não estou usando não.
Desculpa uma duvida…como ficaria a aplicação do Guice e do Spring?
cleison, qual o provider você está usando? Ou pelo menos você pode nos dizer se você tem os jars guice-snapshot, spring-xxx ou pico-xx?
Lucas, em um teste em uma aplicação minha notei que os converters não estavam sendo registrados. Quando voltei para o Spring tudo voltou a funcionar. Vou fazer mais uns testes para ver o que está acontecendo.
Abraços
cleison, qual o provider você está usando? Ou pelo menos você pode nos dizer se você tem os jars guice-snapshot, spring-xxx ou pico-xx?Lucas, em um teste em uma aplicação minha notei que os converters não estavam sendo registrados. Quando voltei para o Spring tudo voltou a funcionar. Vou fazer mais uns testes para ver o que está acontecendo.
Abraços
Tenho os jars do spring e picocontainer. O spring…tem que configurar alguma coisa no web.xml
não precisa configurar nada a mais no web.xml…
mas tire os jars do picocontainer
não precisa configurar nada a mais no web.xml…
mas tire os jars do picocontainer
trocar o setter pra string funcionou?
class Produto {
public void setValor(String valor) {
//codigo q tava no converter
}
}
trocar o setter pra string funcionou?Funciona sim. Se mandar Double com ponto tambem adiciona normal. Tenha algum outra forma de converter?class Produto { public void setValor(String valor) { //codigo q tava no converter } }
uma sugestão:
crie uma classe que representa valores em dinheiro.
usar double é a pior coisa que vc pode fazer, por causa dos erros de arredondamento.
crie a classe:
@Embeddable
public class Moeda {
private BigDecimal valor;
private Moeda() {} //pro hibernate não reclamar
private Moeda(String value) {
this.valor = BigDecimal.valueOf(value);
}
}
no Produto é só trocar o valor pra ser do tipo Moeda, e mudar os getters/setters, q o hibernate vai saber se virar
mude aquele converter de double pra ser um converter de Moeda, e usar o construtor pra criar a moeda.
futuramente vc pode colocar as operações de moeda nessa classe, bem como impressões formatadas e coisas do tipo
que acha?
uma sugestão:
crie uma classe que representa valores em dinheiro.usar double é a pior coisa que vc pode fazer, por causa dos erros de arredondamento.
crie a classe:
@Embeddable public class Moeda { private BigDecimal valor; private Moeda() {} //pro hibernate não reclamar private Moeda(String value) { this.valor = BigDecimal.valueOf(value); } }no Produto é só trocar o valor pra ser do tipo Moeda, e mudar os getters/setters, q o hibernate vai saber se virar
mude aquele converter de double pra ser um converter de Moeda, e usar o construtor pra criar a moeda.
futuramente vc pode colocar as operações de moeda nessa classe, bem como impressões formatadas e coisas do tipo
que acha?
o que não tá funcionando é ter mais de um converter pra mesma coisa… o VRaptor já tem um converter pra Double, e vc tava registrando outro…
se vc registrar um converter pra Moeda vai funcionar
Ufa!!! funcionou da seguinte forma:
l10n no web.xml e na classe o objeto como BigDecimal. Como double não funfa, mas ja resolve meu caso…brigadão
Deixe-me entender… no seu web.xml está com o package scan para br.com.caelum.vraptor.converter.l10n, e usando double não funciona, BigDecimal sim?
O double que voce usava era o primitivo (double minusculo) ou objeto (Double com D maiusculo)?
Deixe-me entender… no seu web.xml está com o package scan para br.com.caelum.vraptor.converter.l10n, e usando double não funciona, BigDecimal sim?O double que voce usava era o primitivo (double minusculo) ou objeto (Double com D maiusculo)?
Isso mesmo Garcia… uma correção double primitivo não funfa o objeto sim (Double).
Uma outra duvida para tratar o ponto da mascara para valores inteiros ex 1.000.
Foi incrementado alguma coisa no vraptor
se vc tivesse dito sobre o double minúsculo a gente tinha resolvido isso antes ¬¬
se o setter da propriedade q vc tá setando for Integer, crie o converter:
@Convert(Integer.class)
public class CustomConverter extends IntegerConverter {
//delegate constructor
public Integer convert(String value, ....) {
if (value == null) return null;
return super.convert(value.replace(".", ""), ...);
}
}
se vc tivesse dito sobre o double minúsculo a gente tinha resolvido isso antes ¬¬se o setter da propriedade q vc tá setando for Integer, crie o converter:
@Convert(Integer.class) public class CustomConverter extends IntegerConverter { //delegate constructor public Integer convert(String value, ....) { if (value == null) return null; return super.convert(value.replace(".", ""), ...); } }
Acabei me confundindo nos tipos de objetos estou setando um Integer sim fiz o converter mas não funfo.
chega a passar por esse converter? dá algum erro?
Conseguir ficou assim.Desculpa o transtorno ai vlw mesmo pessoal.
@Convert(Integer.class)
public class CustomConverter implements Converter<Integer>{
public Integer convert(String value, Class<? extends Integer> type, ResourceBundle bundle) {
if (value == null || value.equals("")) {
return null;
}
try {
return Integer.parseInt( value.replace(".",""));
} catch (NumberFormatException e) {
throw new ConversionError(MessageFormat.format(bundle.getString("is_not_a_valid_number"), value));
}
}
}
Realmente os localized converters funcionam apenas para objetos, não primitivos. Se você quer localizar, o ideal é usar sempre as wrappers Double e Float. Ou melhor, se você trabalha com dinheiro e afins o ideal é sempre usar BigDecimal.
o bug de sobrescrever os converters padrão ou registrar os l10n converters foi corrigido.
testem por favor:
o bug de sobrescrever os converters padrão ou registrar os l10n converters foi corrigido.testem por favor:
Testei aqui em uma aplicação real e funcionando.
Guice a jato
, finalmente posso me livrar do Spring 