JSF h:inputText salva no entity com um dia a menos. [RESOLVIDO]

9 respostas
neoramon

Boa tarde pessoal,

Esteu em um projeto usando JSF 1.2, RichFaces 3.3… JPA eclipselink, javadb.

Quando dou um post com um h:commandButton ele inseri no entity dentro do meu bean de controller os campos de data com um dia a menos.
Estamos usando estrutura de MVC.

Por exemplo:
Quando digito a data 01/01/2000 no entity é setado o valor 31/12/1999… :frowning:

Está é tag que uso para definir minhas datas de nascimento:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:c="http://java.sun.com/jsp/jstl/core"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:rich="http://richfaces.org/rich"
                xmlns:a4j="http://richfaces.org/a4j">
    <h:panelGroup>  
        <script type="text/javascript">
            var hasMasc${id} = false;
        </script>
        <h:inputText value="${value}" validator="#{dataValidator.dataNascimento}" id="${id}" size="10" onfocus="if (!hasMasc${id}) {dataMasc(this); hasMasc${id} = true;};">
            <f:convertDateTime pattern="dd/MM/yyyy"/>
            <rich:ajaxValidator event="onblur" rendered="${valida}"/>
        </h:inputText>        
            <rich:message for="${id}" rendered="${valida}" errorClass="errorFildMessage" infoClass="infoFildMessage"  />
        <rich:jQuery  name="dataMasc" timing="onJScall" query="mask('99/99/9999')" />
    </h:panelGroup>
</ui:composition>

Este é um exemplo de como uso a tag:

<minhaTag:inputDateNascimento value="#{funcionario.entity.pessoa.dataNascimento}" id="dtNascimento" valida="true" />

O campo data no entity.

@Entity
@Table(name="PESSOA_FISICA", uniqueConstraints= {@UniqueConstraint(columnNames = {"RG_NUMERO","NOME_MAE"})})
public class PessoaFisica extends Pessoa{
...
    @Column(name="DATA_NASCIMENTO")
    @Temporal(TemporalType.DATE)
    private Date dataNascimento;
...
}

Aguém tem alguma ideia do pq a data pode estar sendo inserida no entity com um dia a menos?
Talvez algo com jquery?
JSF? RichFaces?

…obs, estou com a maioria dos sites bloqueados, pesquisei pelo forum e não achei nada.

Abraço a todos,

9 Respostas

R

Mas pq criar sua própria tag em vez de usar rich:calendar?

R

tem como vc mostrar o código do validator?

neoramon

Eu quero que o usuário digite a data no lugar de usar o mouse como no rich:calendar.
E criei uma tag para isso pq quero centralizar o componente de data em um lugar só, permetindo assim a manutenção mais facil.

neoramon
import java.sql.Timestamp;
import java.util.Date;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;

/**
 *
 * @author Ramon Rosa da Silva
 */
public class DataValidator {


    public void dataNascimento(FacesContext facesContext, UIComponent uiComponent, Object newValue) {
        if (newValue != null){
        Date data = (Date) newValue;
            if (data.getTime() > new Date().getTime()){
                String msg = "A data digitada é inválida para uma data de nascimento";
                FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg);
                throw new ValidatorException(facesMessage);
            }

        }
    }
}
R

Eu quero que o usuário digite a data no lugar de usar o mouse como no rich:calendar.
E criei uma tag para isso pq quero centralizar o componente de data em um lugar só, permetindo assim a manutenção mais facil.
Acho que o rich:calendar pode ser configurado pra poder digitar tbm.
E qual tipo de mudança que haveria num componente de data?
Sinceramente,acho q reinventou a roda :smiley:

neoramon

Eu quero que o usuário digite a data no lugar de usar o mouse como no rich:calendar.
E criei uma tag para isso pq quero centralizar o componente de data em um lugar só, permetindo assim a manutenção mais facil.
Acho que o rich:calendar pode ser configurado pra poder digitar tbm.
E qual tipo de mudança que haveria num componente de data?
Sinceramente,acho q reinventou a roda :smiley:

Ok, obrigado pela atenção.

R

Mas falando sobre o problema:

  • Já debugou o validator?A data tá chegando certa?
neoramon

raf4ever:
Mas falando sobre o problema:

  • Já debugou o validator?A data tá chegando certa?

Hunnn… Agora debuguei o validator… a data já chega lá com um dia a menos…
Tirei as mascara com jquery, tirei a validação com rich:ajaxValidator, e mesmo assim continua saindo do:

&lt;h:inputText value="${value}"&gt;
              &lt;f:convertDateTime pattern="dd/MM/yyyy"/&gt;
      &lt;/h:inputText &gt;

com um dia a menos… poxa… aposto q é algo simples.

neoramon

Pois é raf4ever,

Acho q eu estava realmente reinventando a roda, fica mais facil de trabalhar com o compenente calendar do richfaces,
Alterei minha tag de data e todos lugares q usavam ela foram alterados.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:c="http://java.sun.com/jsp/jstl/core"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:rich="http://richfaces.org/rich"
                xmlns:a4j="http://richfaces.org/a4j">
    <h:panelGroup>  
        <script type="text/javascript">
            var hasMasc${id} = false;
        </script>             
            <rich:message for="${id}" rendered="${valida}" errorClass="errorFildMessage" infoClass="infoFildMessage"  />
            <rich:jQuery  name="dataMasc" timing="onJScall" query="mask('99/99/9999')" />        
        <rich:calendar id="${id}"
        enableManualInput="true"
        value="${value}" oninputfocus="if (!hasMasc${id}) {dataMasc(this); hasMasc${id} = true;};"
                    datePattern="dd/M/yyyy" validator="#{dataValidator.dataNascimento}"
        todayControlMode="true">
        <rich:ajaxValidator event="onblur" rendered="${valida}"/>
    </rich:calendar>
    </h:panelGroup>
</ui:composition>

Obrigado pela atenção,
Abraço

Criado 26 de novembro de 2010
Ultima resposta 26 de nov. de 2010
Respostas 9
Participantes 3