Solucionado (ver solução)
Solucionado
(ver solução)
14
respostas

Problema no post com o type="date"

Boa tarde pessoal!

Estou com um problema quando adiciono no .jsp um campo do tipo date, não grava...

No .jsp meu código está dessa forma:

    <!--OITAVA LINHA... -->
    <div class="row text-left">
        <div class="col-md-2">
        <span>Data alteração:</span> 
        <input type="date" name="transportadora.data_alteracao" size="10" maxlength="10" id="data_alteracao" class="form-control" value="${transportadora.data_alteracao}" /><br />
        <ebf:validationMessage name="transportadora.data_alteracao" />
    </div>
    <div class="col-md-2"></div>

No model:

    @Temporal(TemporalType.DATE)
    private Date data_alteracao = Calendar.getInstance().getTime();
14 respostas

Opa, qual o erro que dá? O campo do tipo date manda a data no formato yyyy-MM-dd.. Você vai ter que ensinar o vraptor a lidar com a formatação.

Bom dia Alberto!!

Volta para a tela do formulario, pq eu defini dessa forma no UsuarioController:

    @IncludeParameters
    public void adiciona(@Valid Usuario usuario) {
        validator.onErrorRedirectTo(this).index();
        usuarioDao.adiciona(usuario);
        result.redirectTo(this).lista();
    }

E no console do Eclipse aparece:

08:48:26,176  WARN [JstlLocalization    ] couldn't find message bundle, creating an empty one
java.util.MissingResourceException: Can't find bundle for base name messages, locale pt_BR
    at java.util.ResourceBundle.throwMissingResourceException(Unknown Source)
    at java.util.ResourceBundle.getBundleImpl(Unknown Source)
    at java.util.ResourceBundle.getBundle(Unknown Source)
    at br.com.caelum.vraptor.core.JstlLocalization.extractUnsafeBundle(JstlLocalization.java:78)
    at br.com.caelum.vraptor.core.JstlLocalization.getBundle(JstlLocalization.java:69)
    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 org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:93)
    at org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstance(MethodInjectionPoint.java:86)
    at org.jboss.weld.injection.producer.ProducerMethodProducer.produce(ProducerMethodProducer.java:96)
    at org.jboss.weld.injection.producer.AbstractMemberProducer.produce(AbstractMemberProducer.java:151)
    at org.jboss.weld.bean.AbstractProducerBean.create(AbstractProducerBean.java:183)
    at org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69)
    at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:733)
    at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:789)
    at org.jboss.weld.injection.ParameterInjectionPointImpl.getValueToInject(ParameterInjectionPointImpl.java:76)
    at org.jboss.weld.injection.ConstructorInjectionPoint.getParameterValues(ConstructorInjectionPoint.java:138)
    at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:68)
    at org.jboss.weld.injection.producer.AbstractInstantiator.newInstance(AbstractInstantiator.java:28)
    at org.jboss.weld.injection.producer.BasicInjectionTarget.produce(BasicInjectionTarget.java:85)
    at org.jboss.weld.injection.producer.BeanInjectionTarget.produce(BeanInjectionTarget.java:183)
    at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:149)
    at org.jboss.weld.context.AbstractContext.get(AbstractContext.java:96)
    at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:98)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:78)
    at br.com.caelum.vraptor.validator.DefaultValidator$Proxy$_$$_WeldClientProxy.addAll(Unknown Source)
    at br.com.caelum.vraptor.observer.ParametersInstantiator.instantiate(ParametersInstantiator.java:91)
    at sun.reflect.GeneratedMethodAccessor78.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:93)
    at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:266)
    at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:253)
    at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:232)
    at org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:169)
    at org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:165)
    at org.jboss.weld.event.ObserverNotifier.notifyObservers(ObserverNotifier.java:119)
    at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:112)
    at org.jboss.weld.event.EventImpl.fire(EventImpl.java:83)
    at br.com.caelum.vraptor.core.DefaultInterceptorStack.start(DefaultInterceptorStack.java:90)
    at br.com.caelum.vraptor.core.DefaultInterceptorStack$Proxy$_$$_WeldClientProxy.start(Unknown Source)
    at br.com.caelum.vraptor.observer.RequestHandlerObserver.handle(RequestHandlerObserver.java:93)
    at sun.reflect.GeneratedMethodAccessor72.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:93)
    at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:266)
    at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:253)
    at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:232)
    at org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:169)
    at org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:165)
    at org.jboss.weld.event.ObserverNotifier.notifyObservers(ObserverNotifier.java:119)
    at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:112)
    at org.jboss.weld.event.EventImpl.fire(EventImpl.java:83)
    at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:123)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:789)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

Vou dar uma olhada na lista de conversores do VRaptor, e se caso eu não conseguir te falo @Alberto Souza... Obrigado!

Alberto... Adicionei a dependência do Joda-time no pom.xml:

        <dependency>
            <groupId>br.com.caelum.vraptor</groupId>
            <artifactId>vraptor-jodatime</artifactId>
            <version>4.1.0-RC3</version>
        </dependency

Adicionei no web.xml:

    <context-param>
        <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
        <param-value>pt_BR</param-value>
    </context-param>

*Criei o messages.properties na pasta scr:

is_not_a_valid_number = {0} não é um número válido.
is_not_a_valid_integer = {0} não é um inteiro válido.
is_not_a_valid_character = {0} não é um caracter válido.
is_not_a_valid_enum_value = {0} não é uma opção válida.
is_not_a_valid_date = {0} não é uma data válida.
is_not_a_valid_boolean = {0} não é um valor boolean válido.
is_not_a_valid_time = {0} não é um horário válido.
is_not_a_valid_datetime = {0} não é uma data e horário válidos.

*Executei o "mvn eclipse:eclipse" ; o "mvn dependency:tree" e dei um alt+F5 no projeto...

Mas continua da msm forma...

O que mais eu preciso fazer ??

Oi Ewerton

Quando você manda um request com data, ele vai em qual formato? ex: dd/MM/yyyy

Você consegue conferir isso na abinha network do seu navegador.

Acho que o único problema aqui é o formato que a data está sendo enviada.

Rodrigo, fiz um teste e verifiquei que há algo errado no "input", pq eu adicionei a anotação @NotEmpty para o campo data na classe modelo e apareceu a msg de validação "Não pode estar vazio", do meu validationMessage.tag

Meu input está assim:

            <div class="row text-left">
                <div class="col-md-2">
                    <span>Data Cadastro:</span> 
                    <input type="date" name="usuario.data_cadastro" id="data_cadastro" class="form-control" value="${usuario.data_cadastro}" pattern="dd/MMyyyy" autofocus="autofocus" /><br />
                <ebf:validationMessage name="usuario.data_cadastro" />
                </div>
                <div class="col-md-2"></div>
            </div>
            <br />

COM ou SEM o pattern="dd/MMyyyy" está ocorrendo o problema...

Na sua classe Usuário, como está o setter da data_cadastro? Pode mandar o método aqui?

Na classe modelo está assim:

    @NotEmpty
    @Temporal(TemporalType.DATE)
    private Date data_cadastro = Calendar.getInstance().getTime();

E o set:

    public void setData_cadastro(Date data_cadastro) {
        this.data_cadastro = data_cadastro;
    }
solução!

olhando rápido, sem ver o código, acho que o IOGI, que é o responsável por instanciar os parâmetros do request, não gostou muito do underline no nome do atributo e do setter (pra fazer a reflection).

Você consegue fazer um teste rápido e criar um campo dataCadastro, com o setDataCadastro? Tenho quase certeza que ele espera que você siga a convenção do camel case pra funcionar/instanciar.

Perfeito Rodrigo !!! Muito obrigado !!! Um abraço!!

.

Estranho Rodrigo... Se eu alterar de "data_cadastro" para "dataCadastro" no .jsp do formulário, volta a ocorrer o problema...

O input não deveria ser nomeDaclasse.nomeDoMeuAtributo, "idêntico" a classe modelo ??

Bom vou deixar assim por enquanto...

Oi Ewerton

No final, como ficou o nome do atributo e o nome do setter? em qual caso da o problema?

Ele procura pelo setter de acordo com o nome de atributo que você passou, seguindo as convenções do Java (case de camelo, sem os underlines)

Bom dia Rodrigo! Como eu estou trabalhando em um sistema que hoje está em produção "tenho que manter" o padrão já utilizado pelo desenvolvimento...

Então na classe modedo ficou:

    @NotNull
    @Temporal(TemporalType.DATE)
    @Column(name = "data_cadastro")
    private Date dataCadastro = Calendar.getInstance().getTime();

Getter/Setter: ``` public Date getDataCadastro() { return dataCadastro; }

public void setDataCadastro(Date dataCadastro) { this.dataCadastro = dataCadastro; }


No formulario.jsp:

Data Cadastro:

E na listagem.jsp:

```

Assim está funcionando perfeitamente...

Obrigado pela ajuda!!!

Um abraço!!