Struts

22 respostas
caiomacedor
Gostaria que se possivel alguem me esclareça essa duvida. Tenho esse Bean:
private Date dtNascimento;
	public Date getDtNascimento() {
		return dtNascimento;
	}
	public void setDtNascimento(Date dtNascimento) {
		this.dtNascimento = dtNascimento;
	}

Esse form:

private Pessoa pessoa;
 	public Pessoa getPessoa() {
		return pessoa;
	}
	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}
e isso no *.jsp
<div class="label-form02">Data de Nascimento:</div>
<div class="input-form01"><html:text styleId="txtDtNascimento" name="pessoaForm" property="pessoa.dtNascimento" /></div>
Acontece que ao preencher o campo dtNascimento, e submeter para o form esta me lançando uma exception:
javax.servlet.ServletException: BeanUtils.populate
	at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:475)
	at org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:50)
	at org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:60)
	at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.commons.beanutils.ConversionException: String must be in JDBC format [yyyy-MM-dd] to create a java.sql.Date
	at org.apache.commons.beanutils.converters.DateTimeConverter.toDate(DateTimeConverter.java:436)
	at org.apache.commons.beanutils.converters.DateTimeConverter.convertToType(DateTimeConverter.java:343)
	at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:156)
	at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:60)
	at org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:470)
	at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1006)
	at org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:830)
	at org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:433)
	at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:473)

Gostaria de saber se existe alguma forma de resolver isso, sem ter que mudar o tipo da variavel, dtNascimento para String, lá no Bean?
Muito obrigado a todos.

22 Respostas

fabiozoroastro

Esse seu objeto Date é:
java.util.Date ou java.sql.Date?
Tente usar o java.util.Date.
Abraço.

caiomacedor

Também deu erro ao converter…

WARNING: Unhandled exception javax.servlet.ServletException: BeanUtils.populate at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:475) at org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:50) at org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:60) at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51) at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191) at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305) at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191) at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Unknown Source) Caused by: org.apache.commons.beanutils.ConversionException: DateConverter does not support default String to 'Date' conversion. at org.apache.commons.beanutils.converters.DateTimeConverter.toDate(DateTimeConverter.java:468) at org.apache.commons.beanutils.converters.DateTimeConverter.convertToType(DateTimeConverter.java:343) at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:156) at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:60) at org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:470) at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1006) at org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:830) at org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:433) at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:473)

T

Iai Cara, tudo bem? Então, creio que seu problema seja na hora de instanciar o bean, ele não consegue fazer a conversão de String que é o que chega do seu formulário para um tipo Date, em JSF tem um conversor <f:convertDateTime pattern=“dd/MM/yyyy” /> que faz isso, em struts eu não sei. Mas não tem como você criar uma action que recebe essa string e instancia esse Date pra você ou algo do tipo??

se o que eu disse não tiver nada a ver, me corrijam.vlw…

caiomacedor

Acontece que pelo que vejo, ao submet o formulaario ele vai primeiro la no form para setar os valores no bean, aí é onde rola o error.

javax.skol

http://www.guj.com.br/posts/list/69062.java

caiomacedor

Cara fiz o que o Marcelo indicou mas não resolveu.

Olha meu ActionForm:
public class PessoaForm extends ActionForm {
	private static final long serialVersionUID = 1L;

	public PessoaForm() {
		ConvertUtils.register(new DateBeanConvert(), Date.class);
	}
	
	private Pessoa pessoa;
	
	public Pessoa getPessoa() {
		return pessoa;
	}
	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}
	
	public void reset(ActionMapping mapping, HttpServletRequest request) {
		this.pessoa = new Pessoa();
		super.reset(mapping, request);
	}
	
}
Esse é o conversor:
public class DateBeanConvert implements Converter {

	public Object convert(Class classe, Object object) {
		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
		Date date = null;
		try {
			date = format.parse((String)object);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
}
continua o mesmo erro.
javax.servlet.ServletException: BeanUtils.populate
	at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:475)
	at org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:50)
	at org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:60)
	at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.commons.beanutils.ConversionException: DateConverter does not support default String to 'Date' conversion.
	at org.apache.commons.beanutils.converters.DateTimeConverter.toDate(DateTimeConverter.java:468)
	at org.apache.commons.beanutils.converters.DateTimeConverter.convertToType(DateTimeConverter.java:343)
	at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:156)
	at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:60)
	at org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:470)
	at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1006)
	at org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:830)
	at org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:433)
	at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:473)
fabiozoroastro

Se vc digitar a data no formato correto, funciona?

caiomacedor

digito assim por exemplo 01/01/2009

fabiozoroastro

Ainda não está sendo utilizado o seu conversor:

caiomacedor

Mas o que esta errado então pra que ele ainda não esta sendo usado?

fabiozoroastro

Vc colocou um breakpoint no construtor do seu form pra ver se ele realmente entra aí?

caiomacedor

Coloquei um breakPoint no construtor, ele chega no construtur do Form. Dai dei um F5 ele vai pra Classe DateBeanConvert, mas não entra nesse metodo:

public Object convert(Class classe, Object object) { SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); Date date = null; try { date = format.parse((String)object); } catch (ParseException e) { e.printStackTrace(); } return date; }

fabiozoroastro

Ele só vai entrar neste método quando o form for submetido.
Estranho ele não setar o registrador…
Esse Date.class que vc setou é java.util.Date(igual ao atributo java.util.Date) da classe Pessoa?

caiomacedor

Ô fera obrigado pela dica, o Date que esta no Form estava errado rsrs. Ele era um import java.sql.Date;
Fiz a correção e agora funfou…
Valew obrigado a todos.

fabiozoroastro

Eheh, falou. Abraço.

caiomacedor

Mas uma rsrs… Se eu quiser deixar com import java.sql.Date;? Como eu tenho que colocar aqui no conversor: date = format.parse((String)object);
porque dessa forma esta dando erro. E se eu faço um Cast pra Date, depois da erro na converção.

fabiozoroastro

Em qual momento vc faz cast para java.sql.Date? Posta o seu código de conversão aqui.

caiomacedor
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.apache.commons.beanutils.Converter;

public class DateBeanConvert implements Converter {

	public Object convert(Class classe, Object object) {
		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
		Date date = new Date(0);
		try {
			date = (Date) format.parse((String)object);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
}

É esse o Codigo

fabiozoroastro

Caio, você não pode usar somente a java.util.Date? Geralmente vc só precisa usar o java.sql.Date se for implementar as suas querys com JDBC.

javax.skol

Isso caiomacedor
faça como fabio… falou
mude pra java.util.Date e teste

caiomacedor

Sim fiz isso e já funcionou, mas e no caso de fazer persitencia com um banco, usando PreparedStatement? Ai vou precisar de um sql.Date. Por isso que ja queria converter pra esse tipo.

javax.skol

converta na hora de passar

java.sql.Date sqlDate = new java.sql.Date(dataDoUtil.getTime());
Criado 26 de março de 2009
Ultima resposta 26 de mar. de 2009
Respostas 22
Participantes 4