Tentando subtrair datas que são menores que 16 anos

19 respostas
java
G

package manager;

import java.util.Calendar;

import java.util.Date;

import java.util.GregorianCalendar;
import javax.faces.application.FacesMessage;

import javax.faces.component.UIComponent;

import javax.faces.context.FacesContext;

import javax.faces.validator.FacesValidator;

import javax.faces.validator.Validator;

import javax.faces.validator.ValidatorException;

import entity.Cliente;

@FacesValidator(“dataNacValidator”)
public class DataNacValidator implements Validator {

private Date data_hoje;
private Cliente cliente;

public Cliente getCliente() {
	return cliente;
}
public void setCliente(Cliente cliente) {
	this.cliente = cliente;
}
public void validate(FacesContext ctx, UIComponent cmpt, Object valor) throws ValidatorException {
	validateBeginDate(ctx, cmpt, valor);
}

public void validateBeginDate(FacesContext context, UIComponent component,
		Object value) {
	data_hoje = new Date();
	Calendar calendar = Calendar.getInstance();
	calendar.add(Calendar.YEAR, -16);
	System.out.println("Data Hoje: "+ data_hoje);
	System.out.println("Data Nasc: "+ cliente.getDataNascimento());
	Integer result = data_hoje.getDate() - cliente.getDataNascimento().getDate();
	System.out.println("Resultado: "+result);
	if (result <= 16) {
		throw new ValidatorException(new FacesMessage(
				"Data de Nasciemto Invalida!!!"));
	}
}

}

pegando a data de nascimento da classse cliente, e não esta dando

java.lang.NullPointerException

manager.DataNacValidator.validateBeginDate(DataNacValidator.java:39)

manager.DataNacValidator.validate(DataNacValidator.java:30)

javax.faces.component.UIInput.validateValue(UIInput.java:1147)

javax.faces.component.UIInput.validate(UIInput.java:965)

org.primefaces.component.calendar.Calendar.validate(Calendar.java:429)

javax.faces.component.UIInput.executeValidate(UIInput.java:1209)

javax.faces.component.UIInput.processValidators(UIInput.java:698)

javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1086)

javax.faces.component.UIForm.processValidators(UIForm.java:244)

javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1086)

org.primefaces.component.panel.Panel.processValidators(Panel.java:281)

javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1086)

javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1086)

javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1165)

com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)

com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)

com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)

javax.faces.webapp.FacesServlet.service(FacesServlet.java:508)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

19 Respostas

Narclk

Você está tentando pegar um valor de um objeto null, que no caso é a instância da sua classe cliente.

System.out.println("Data Nasc: "+ cliente.getDataNascimento());
	Integer result = data_hoje.getDate() - cliente.getDataNascimento().getDate();

Entenda que nas fases do Jsf o processo de validação vem antes da atualização dos dados, então é coerente afirmar que seu cliente não tem uma data, há não ser que no construtor da classe tenha um inicializador para ela. Assim no minimo você teria que dar new Cliente(), antes de tentar pegar o valor da data de nascimento, que não é o seu caso, pois aí o uso de um validador seria inútil.

O ambiente ideal seria a data não vir do cliente e sim da requisição, e se passar pela validação, o cliente setaria o valor da data.

Para isso você tem que usar o value do tipo Object, ele é quem tem o valor da data a ser validado.

Seria alguma coisa como isso:

public void validateBeginDate(FacesContext context, UIComponent component,
		Object value) {
	data_hoje = new Date();
	Calendar calendar = Calendar.getInstance();
	calendar.add(Calendar.YEAR, -16);
	System.out.println("Data Hoje: "+ data_hoje);
       
       DateFormat df = new SimpleDateFormat("dd/MM/yyyy");  
       Date nascimento =  df.parse(value.toString()); 

	System.out.println("Data Nasc: "+ nascimento);
	Integer result = data_hoje.getDate() - nascimento;
	System.out.println("Resultado: "+ result);
	if (result <= 16) {
		throw new ValidatorException(new FacesMessage(
				"Data de Nasciemto Invalida!!!"));
	}
}
G

package manager;

import java.text.DateFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import java.util.GregorianCalendar;
import javax.faces.application.FacesMessage;

import javax.faces.component.UIComponent;

import javax.faces.context.FacesContext;

import javax.faces.validator.FacesValidator;

import javax.faces.validator.Validator;

import javax.faces.validator.ValidatorException;

import entity.Cliente;

@FacesValidator(“dataNacValidator”)
public class DataNacValidator implements Validator {

private Date data_hoje;

public void validate(FacesContext ctx, UIComponent cmpt, Object valor) throws ValidatorException {
  try{
	  validateBeginDate(ctx, cmpt, valor);  
  }catch(Exception ex){
	  ex.printStackTrace();
  }
}

public void validateBeginDate(FacesContext context, UIComponent component,
		Object value) throws ParseException {
	data_hoje = new Date();
	Calendar calendar = Calendar.getInstance();
	calendar.add(Calendar.YEAR, -16);
	System.out.println("Data Hoje: "+ data_hoje);
       
       DateFormat df = new SimpleDateFormat("dd/MM/yyyy");  
       Date nascimento =  df.parse(value.toString()); 

	System.out.println("Data Nasc: "+ nascimento);
	Integer result = data_hoje.getDate() - nascimento.getDate();
	System.out.println("Resultado: "+ result);
	if (result <= 16) {
		throw new ValidatorException(new FacesMessage(
				"Data de Nasciemto Invalida!!!"));
	}
}

}

teria que colocar o try e catch

G

package manager;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import java.util.GregorianCalendar;
import javax.faces.application.FacesMessage;

import javax.faces.component.UIComponent;

import javax.faces.context.FacesContext;

import javax.faces.validator.FacesValidator;

import javax.faces.validator.Validator;

import javax.faces.validator.ValidatorException;

import entity.Cliente;

@FacesValidator(“dataNacValidator”)
public class DataNacValidator implements Validator {

public void validate(FacesContext ctx, UIComponent cmpt, Object valor) throws ValidatorException {
	validateBeginDate(ctx, cmpt, valor);
}

public void validateBeginDate(FacesContext context, UIComponent component,
		Object value) {
	Date data_hoje = new Date();
	Calendar calendar = Calendar.getInstance();
	calendar.add(Calendar.YEAR, -16);
	System.out.println("Data Hoje: "+ data_hoje);
       
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");  
    Date nascimento =  df.parse(value.toString()); 

	System.out.println("Data Nasc: "+ nascimento);
	Integer result = data_hoje.getDate() - nascimento.getDate();
	System.out.println("Resultado: "+ result);
	if (result <= 16) {
		throw new ValidatorException(new FacesMessage(
				"Data de Nasciemto Invalida!!!"));
	}
}

}

df.parse(value.toString()); <- dando erro nessa linha

G

eles pedem para usar o try e catch mais não passa pela validação

A

Imprima o value.toString(), o formato dele deve ser compatível com o passado dd/MM/yyyy, tipo:
value.toString -> “02/04/1999”.
Não deve ser impresso algo como I@8cf4c6 ou fora do formato passado, ex: “02 04 1999”, pois o formato tem barra.

rodevops

Se estiver usando java 8, pode tentar API do pacote java.util.time…

Há exemplos de cálculos com datas…

G

Date nascimento = df.parse(value.toString());
System.out.println(df.parse(“dd/MM/yyyy”));

tbm assim não funciona

G
public void validateBeginDate(FacesContext context, UIComponent component,

Object value) {

Date data_hoje = new Date();

Calendar calendar = Calendar.getInstance();

calendar.add(Calendar.YEAR, -16);

System.out.println("Data Hoje: "+ data_hoje);
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");  
    Date nascimento =  new Date();
    System.out.println(df.format(value.toString()));
    System.out.println("Data Nasc: "+ nascimento); <- fiz a impressão e o java não compilou, deu erro
    Integer result = data_hoje.getDate() - nascimento.getDate();
	System.out.println("Resultado: "+result);
	if (result <= 16) {
		throw new ValidatorException(new FacesMessage(
				"Data de Nasciemto Invalida!!!"));
	}
}
java.lang.IllegalArgumentException: Cannot format given Object as a Date

at java.text.DateFormat.format(Unknown Source)

at java.text.Format.format(Unknown Source)

at manager.DataNacValidator.validateBeginDate(DataNacValidator.java:33)

at manager.DataNacValidator.validate(DataNacValidator.java:20)

at javax.faces.component.UIInput.validateValue(UIInput.java:1147)

at javax.faces.component.UIInput.validate(UIInput.java:965)

at org.primefaces.component.calendar.Calendar.validate(Calendar.java:429)

at javax.faces.component.UIInput.executeValidate(UIInput.java:1209)

at javax.faces.component.UIInput.processValidators(UIInput.java:698)

at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1086)

at javax.faces.component.UIForm.processValidators(UIForm.java:244)

at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1086)

at org.primefaces.component.panel.Panel.processValidators(Panel.java:281)

at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1086)

at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1086)

at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1165)

at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)

at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)

at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)

at javax.faces.webapp.FacesServlet.service(FacesServlet.java:508)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)

at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659)

at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515)

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)
G
public void validateBeginDate(FacesContext context, UIComponent component,

Object value) {

Date data_hoje = new Date();

Calendar calendar = Calendar.getInstance();

calendar.add(Calendar.YEAR, -16);

System.out.println("Data Hoje: "+ data_hoje);
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");  
    Date nascimento =  new Date();
    System.out.println("Data Nasc: "+ df.format(nascimento));
    Integer result = data_hoje.getDate() - nascimento.getDate();
	System.out.println("Resultado: "+result);
	if (result <= 16) {
		throw new ValidatorException(new FacesMessage(
				"Data de Nascimento Invalida!!!"));
	}
}

Data Hoje: Mon Sep 04 10:41:50 BRT 2017
Data Nasc: 04/09/2017
Resultado: 0
Data Hoje: Mon Sep 04 10:42:20 BRT 2017
Data Nasc: 04/09/2017
Resultado: 0

A

Agora esta imprimindo, mas resolveu sua necessidade?
Ou tem algum erro novo?
Té+

G

não esta deixxando colocar outra data , só aparece a data de hoje

Narclk

Como eu disse, o valor vem do objeto value, mas em nenhuma parte do seu código você faz a atribuição desse valor para sua variável nascimento.

Você está apenas dando new Date() e pegando a data atual com nascimento.getDate().

Em algum momento do código você tem que fazer algo como isso:

DateFormat df = new SimpleDateFormat("formato da data");  
    Date nascimento =  df.parse(value.toString());

Para resolver esse seu problema, o primeiro passo é imprimir o valor de value, para saber qual o valor está sendo interceptado pelo filtro.

System.out.println(value);

À partir daí você tem como resolver, pois saberá o que realmente está vindo do seu inputtext.

G

Unhandled exception type ParseException df.parse(value.toString())

quando coloca o ParseException e o try e catch eles não reconhecem a validação

Date data_hoje = new Date();

Calendar calendar = Calendar.getInstance();

calendar.add(Calendar.YEAR, 16);

System.out.println("Data Hoje: "+ data_hoje.getDate());
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");  
    Date nascimento = df.parse(value.toString()); <- erro
    System.out.println(value.toString());
	System.out.println("Data Nasc: "+ nascimento.getDate());
	Integer result = data_hoje.getDate() - nascimento.getDate();
	System.out.println("Resultado: "+ result);
	if (result <= 16) {
		throw new ValidatorException(new FacesMessage(
				"Data de Nasciemto Invalida!!!"));
	}
A
public void validateBeginDate(FacesContext context, UIComponent component, Object value) {
   JOptionPane.showMessageDialog(null, "Formato esperado dd/MM/yyyy\nRecebido -> "+value.toString());
   DateFormat df = new SimpleDateFormat("dd/MM/yyyy");  
   Date nascimento =  df.parse(value.toString()); 
   JOptionPane.showMessageDialog(null, "Operação realizada");
}

Faça este teste e veja o que está errado.
São duas mensagens, que devem ser lidas.
Depois, refaça a implementação.

G

deu certo, obrigado!!

G

<h:head>

</h:head>

<h:body>

<p:panel header=“Logar no Sistema”>

<h:form>

<h:panelGrid columns=“2” cellpadding=“10”>

<p:outputLabel for=“basico” value=“escolha o Tema”/>

<p:themeSwitcher id=“basico” style=“width:165px”>

<f:selectItem itemLabel=“Selecione o Tema” itemValue=""/>

<f:selectItems value="#{mbTema.temas}" var=“tema"

itemLabel=”#{tema.displayName}" itemValue="#{<a href="http://tema.name">tema.name</a>}"/>

</p:themeSwitcher>

</h:panelGrid>

</h:form>

<h:form id=“form1”>
<p:outputLabel value="Login"/>
       <p:inputText value="#{mbusu.usuario.login}"/>
       
       <p:outputLabel value="Senha"/>
       <p:password value="#{mbusu.usuario.senha}"/>
       
       <p:commandButton value="Logar" action="#{mbusu.logar}" update=":form2" ajax="false"></p:commandButton>
       
 </h:form>
 <p:messages></p:messages>
</p:panel>

<p:separator></p:separator>

<p:panel header=“Figura”>

<img alt>

</p:panel>

</h:body>

não estou conseguindo visalizar o mapa no google maps

G

G

<h:head>
<f:metadata>
<f:event listener="#{mbusu.verificarLogin}" type=“preRenderView”></f:event>
</f:metadata>

A

O ideal seria criar um outro tópico e encerrar este, pois o título é incompatível com sua necessidade atual.
Isso permitiria encontrar uma solução mais rápida, pois quem entra no tópico espera uma coisa e vê outra.
Em particular, eu não disponho, no momento, do conhecimento para prover uma solução.
Sucesso
Té+

Criado 3 de setembro de 2017
Ultima resposta 12 de set. de 2017
Respostas 19
Participantes 4