[RESOLVIDO] Vraptor 3 - Tratamento de tipo de objeto da view

46 respostas
C

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

46 Respostas

G

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) {
    [...]
}
Guevara

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!

C

Guevara:
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!


Ok
com fmt tratamos o retorno certo?
Como tratar o valor com virgula enviado?
ex. 10,00 o vraptor converte para 10.00?

Lucas_Cavalcanti

se vc estiver com o locale pt_BR, sim

C

Coloquei no web.xml mas não está convertendo.

Lucas_Cavalcanti

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>
C

Lucas Cavalcanti:
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?

Lucas_Cavalcanti

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?

C

Lucas Cavalcanti:
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?

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)

Lucas_Cavalcanti

qual é o tipo que o produto.setValor() recebe?

C

Double

Lucas_Cavalcanti

e que valor é colocado no produto.getValor()?

C

1,1

Lucas_Cavalcanti

então não entendi qual é o problema… o valor não está correto?

C

Como tratar o valor que vem da view converter 1,1 para 1.1 e setar.

Lucas_Cavalcanti

o VRaptor faz isso automaticamente…

faça na sua lógica:

System.out.println(produto.getValor());

o que ele imprime?

C

Lucas Cavalcanti:
o VRaptor faz isso automaticamente…

faça na sua lógica:

System.out.println(produto.getValor());

o que ele imprime?

Ele imprimi 0.0

Lucas_Cavalcanti

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

C
Lucas Cavalcanti:
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
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?
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));  
		         }  
		     } 
}
Lucas_Cavalcanti

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?

C

Lucas Cavalcanti:
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

Lucas_Cavalcanti

parece ser um bug então =(

no log de debug aparece um :

applying produto.valor with [1,1]

?

C

Lucas Cavalcanti:
parece ser um bug então =(

no log de debug aparece um :

applying produto.valor with [1,1]

?


Aparece sim.
Atualizei para a versão 3.2
Está aparecendo no log entre os applying.

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.

Lucas_Cavalcanti

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

G

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.

Lucas_Cavalcanti

cleison, vc tá usando o guice?

garcia, coloca isso lá na issue do bug, por favor?

C

Lucas Cavalcanti:
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?

G

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

C

garcia-jj:
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

Lucas_Cavalcanti

não precisa configurar nada a mais no web.xml…
mas tire os jars do picocontainer

C

Lucas Cavalcanti:
não precisa configurar nada a mais no web.xml…
mas tire os jars do picocontainer

Lucas retirei persiste o problema…tem mais algum jar que não pode está na lib?

Lucas_Cavalcanti

trocar o setter pra string funcionou?

class Produto {
 
   public void setValor(String valor) {
        //codigo q tava no converter
   }
}
C
Lucas Cavalcanti:
trocar o setter pra string funcionou?
class Produto {
 
   public void setValor(String valor) {
        //codigo q tava no converter
   }
}
Funciona sim. Se mandar Double com ponto tambem adiciona normal. Tenha algum outra forma de converter?
Lucas_Cavalcanti

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?

C

Lucas Cavalcanti:
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?


Mas se os converters não estão funcionando, desta forma tambem não irá… vou usar também objetos que receberá peso.
O que podemos fazer ainda… para tentar funcionar converters?

Lucas_Cavalcanti

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

C

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

G

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)?

C

garcia-jj:
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

Lucas_Cavalcanti

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(".", ""), ...);
    }
}
C
Lucas Cavalcanti:
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.

Lucas_Cavalcanti

chega a passar por esse converter? dá algum erro?

C

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));  
        }  
    } 

}
Mais imports
G

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.

Lucas_Cavalcanti

o bug de sobrescrever os converters padrão ou registrar os l10n converters foi corrigido.

testem por favor:

https://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.2.1-SNAPSHOT/vraptor-3.2.1-20101020.034131-2.jar

G

Lucas Cavalcanti:
o bug de sobrescrever os converters padrão ou registrar os l10n converters foi corrigido.

testem por favor:

https://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.2.1-SNAPSHOT/vraptor-3.2.1-20101020.034131-2.jar

Testei aqui em uma aplicação real e funcionando.

Guice a jato :smiley: , finalmente posso me livrar do Spring :smiley:

Criado 27 de setembro de 2010
Ultima resposta 20 de out. de 2010
Respostas 46
Participantes 4