Como resolve o Erro java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Date

8 respostas Resolvido
java
H

Estava usando uma campo data formato do tipo campo de texto, estava funcionando bem, só que pensei em implementar o Calendário da classe calendar em Java, dai começou o erro, parece que não estava pegando as datas que é inserida.

public void imprimirPorData() {
	String src = "RelatorioPorData.jasper";
	JasperPrint jasperPrint = null;
	int confirma = JOptionPane.showConfirmDialog(null, "Relatório Por Data?", "Atenção", JOptionPane.YES_NO_OPTION);
	
	if (confirma == JOptionPane.YES_OPTION) {
		HashMap filtro = new HashMap();
		
		try {
			filtro.put("DataInicio",(txtDataInicio.getDateFormatString()));
			filtro.put("DataFim",(txtDataFim.getDateFormatString()));
			jasperPrint = JasperFillManager.fillReport(src, filtro, conexao);
			
			// linha exibe relatorio 
			JasperViewer jasp = new JasperViewer(jasperPrint, false);
			jasp.setVisible(true);
		} catch (JRException ex) {
			Logger.getLogger(OpcaoRelatorios.class.getName()).log(Level.SEVERE, null, ex);
		}
	}
}

O ERRO

at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.setDate(JRJdbcQueryExecuter.java:649)
	at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.setStatementParameter(JRJdbcQueryExecuter.java:577)
	at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.setStatementParameter(JRJdbcQueryExecuter.java:399)
	at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter$1.visit(JRJdbcQueryExecuter.java:332)
	at net.sf.jasperreports.engine.query.JRAbstractQueryExecuter$QueryParameter.accept(JRAbstractQueryExecuter.java:157)
	at net.sf.jasperreports.engine.query.JRAbstractQueryExecuter.visitQueryParameters(JRAbstractQueryExecuter.java:646)
	at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createStatement(JRJdbcQueryExecuter.java:317)
	at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:196)
	at net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:1114)
	at net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:691)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:1314)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:931)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:873)
	at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:87)
	at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:287)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:760)

8 Respostas

L
Solucao aceita

Provavelmente o field DataInicio está definido com o tipo java.util.Date no relatório e vc está passando java.lang.String.

Vc deve passar uma data válida no filtro:

filtro.put("DataInicio", new java.util.Date());

Ou converter a string conforme o pattern utilizado, ex.:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyyy");
filtro.put("DataInicio", sdf.parse(txtDataInicio.getDateFormatString());

Ao converter com o método parse, será exigido que vc adicione um try … catch ou um throws no seu código.

H

show resolvido com essa linha que vc falou filtro.put(“DataInicio”, new java.util.Date());
Muito obrigado

L

Porém, essa linha cria um objeto date com data e hora do momento. Acredito que vc queira utilizar como filtro uma data informada no campo de texto da sua tela, ou seja, deve-se converter a string para data.

H

sim, outra coisa é como colocar mascara no campo, pois assim não será possivel que o usuário escrever uma letra por exemplo

L

Para isso, vc pode usar JFormattedTextField.

H

eu usei, mas ai ficaria vulnerável, pois o usuário poderia inserir uma data invalida como ano bisseto por exemplo.

L

Verdade. Talvez vc possa criar um mecanismo que, quando o usuário terminar de digitar, vc valide o valor e retorne com uma mensagem em caso de data inválida, e já limpando o campo.

H

sim, validador de datas, boa ideia

Criado 8 de julho de 2020
Ultima resposta 8 de jul. de 2020
Respostas 8
Participantes 2