[Logo] Mentawai Forum - Mentawai Web Framework
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 

Forum Read-Only! Check the new site and forum here!

VOFilter + atributos Date  XML
Forum Index -> Comentários Gerais
Author Message
boaglio


[Avatar]

Joined: 28/09/2005 11:05:16
Messages: 299
Location: Sao Paulo - Brazil
Offline


Oi,

Estou fazendo uma app usado no VOFilter com uma classe.

Dentro da action ele vem preenchida do JSP com quase todos
os campos, exceto o campo data (que é java.sql.Date),
que eu preencho no formato YYYY-MM-DD, mas sempre vem NULL.

Isso era esperado mesmo? Preciso usar String e no DAO
converter a data?

Estou usando mentawai 1.1.1 .



http://www.boaglio.com
[WWW]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline


Sim, isso é esperado, pois o seu objeto espera um Date e tá vindo um String.

Pra resolver isso é simples: Antes do VOFilter vc coloca um ConvertionFilter para converter. Detalhe: Convertion joga exception se nao conseguir converter, logo vc precisa tb de um ValidationFilter para quando for converter vc ter certeza que é convertível.

No MyBooks isso é ilustrado no cadastro de livros.


Sergio Oliveira

boaglio


[Avatar]

Joined: 28/09/2005 11:05:16
Messages: 299
Location: Sao Paulo - Brazil
Offline


Legal Sérgio,


Eu dei uma olhada e testei o DateConverter, mas ele só tem construtor para os estilos do DateFormat (SHORT ,MEDIUM ,LONG e FULL).

Tem como definir o meu estilo direto no conversor?

Algo assim:

Code:
 	public void initConverters() {
 		add("dataPublic", new DateConverter("YYYY-MM-DD"));
 	}
 



http://www.boaglio.com
[WWW]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline

Tem razão. Então vc vai ter que criar o seu próprio Converter, o que é muito simples.

Vc pode extender BasicConverter ou LocaleConverter.

No caso de datas, faz sentido usar o Locale para converter, pois cada lingua tem o seu tipo de data. Se esse for o seu caso extenda o LocaleConverter.

Se for um caso específico para um formato em questão, extenda o BasicConverter.

Nada te impede também de implementar a interface Converter.

Veja o código fonte do DateConverter para ter uma idéia.

Sergio Oliveira

boaglio


[Avatar]

Joined: 28/09/2005 11:05:16
Messages: 299
Location: Sao Paulo - Brazil
Offline

Então... fiz o seguinte esquema:

Code:
 public class MySQLDateConverter extends LocaleConverter {
 
 	private final String MYSQL_MASK="yyyy-MM-dd";
 
 	public Object convert(Object value, Locale loc) throws ConversionException {
 
 		if (value instanceof String) {
 			String s = (String) value;
 			SimpleDateFormat sdf = new SimpleDateFormat(MYSQL_MASK,loc);
 			sdf.setLenient(false);
 			try {
 				return sdf.parse(s);
 			} catch(ParseException e) {
 				throw new ConversionException(e);
 			}
 		} else {
 			throw new ConversionException("MySQLDateConverter can only parse strings: " + value.toString());
 		}
 	}
 }
 


E depois:

Code:
 public class NovidadeConversionFilter extends ConversionFilter {
 
 	public void initConverters() {
 		add("dataPublic", new MySQLDateConverter());
 	}
 


Mas mesmo assim no VO a data "dataPublic" continua vindo nula...
Eu debuguei o convertor e lá chega e retorna a DAta certinho, mas
por algum motivo na Action chega nula

http://www.boaglio.com
[WWW]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline

O problema está no VOFilter na hora de colocar esse atributo no campo dataPublic, certo ?

Ele não está colocando, certo ?

Se for isso coloca aqui o código do objeto que está recebendo esse valor, isto é, o objeto que o VOFilter está criando com os valores do input.

Ou vc está injetando direto no action esse valor ?


Sergio Oliveira

boaglio


[Avatar]

Joined: 28/09/2005 11:05:16
Messages: 299
Location: Sao Paulo - Brazil
Offline

saoj wrote:
O problema está no VOFilter na hora de colocar esse atributo no campo dataPublic, certo ?
Ele não está colocando, certo ?
 

Isso.


saoj wrote:

Se for isso coloca aqui o código do objeto que está recebendo esse valor, isto é, o objeto que o VOFilter está criando com os valores do input.
Ou vc está injetando direto no action esse valor ?
 


É na Action mesmo, tem uma innerAction "novo" que chama esse método:

Code:
 public String novo() throws Exception {
  NovidadeDAO dao = NovidadeDAO.getInstance();
  try {
    dao.adiciona(vo);
   } catch (DAOException e) {
    logger.error("erro no cadastro!",e);
   }
   return SUCCESS;
 }
 


E no loadActions tá assim:

Code:
 public void loadActions() {
 // novidade
 ActionConfig ac = new ActionConfig("/cadastro/novidade", NovidadeAction.class,"novo");
 ac.addConsequence(NovidadeAction.SUCCESS, new Forward("/cadastro/novidade.jsp"));
 ac.addConsequence(NovidadeAction.ERROR, new Forward("/cadastro/novidade.jsp"));
 ac.addFilter(new NovidadeValidation());
 ac.addFilter(new NovidadeConversionFilter());
 ac.addFilter(new VOFilter(NovidadeVO.class, "vo"));
 ac.addFilter(new InjectionFilter(true));
 addActionConfig(ac);
 }
 

http://www.boaglio.com
[WWW]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline

O dataPublic dentro de NovidadeVO está ficando NULL, o resto está ok, certo ?

Coloca o código do NovidadeVO aqui, please.


Sergio Oliveira

boaglio


[Avatar]

Joined: 28/09/2005 11:05:16
Messages: 299
Location: Sao Paulo - Brazil
Offline


Isso mesmo, os outros campos vem preechidos.

o VO é esse:

Code:
 import java.io.Serializable;
 import java.sql.Date;
 
 public class NovidadeVO implements Serializable  {
 
     private static final long serialVersionUID = 3256720667452782647L;
     private int id;
     private Date dataPublic;
     private String link;
     private int tipo;
     private String texto;
     private UsuarioVO usuarioVO=new UsuarioVO();
 
   --- getters e setters
 

http://www.boaglio.com
[WWW]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline

O erro é o seguinte:

Vc está tentando injetar um java.util.Date num java.sql.Date.

java.sql.Date é um java.util.Date mas o oposto não é verdadeiro.




Sergio Oliveira

boaglio


[Avatar]

Joined: 28/09/2005 11:05:16
Messages: 299
Location: Sao Paulo - Brazil
Offline

saoj wrote:
O erro é o seguinte:
Vc está tentando injetar um java.util.Date num java.sql.Date.
java.sql.Date é um java.util.Date mas o oposto não é verdadeiro.
 


Bingo!

Era isso mesmo, agora tá funcionando!

http://www.boaglio.com
[WWW]
 
Forum Index -> Comentários Gerais
Go to:   
Powered by JForum 2.1.6 © JForum Team