Estou utilizando o Struts 2.xx e Tomcat 7.xx. Sou iniciante no Struts.
Tenho um campo do tipo Calendar, chamado dataNascimento no Bean Pessoa. No JSP tenho um campo correspondente ao atributo acima. O preenchimento deve ser opcional.
Quando o cliente preenche o formulário com uma data inválida, como: “abc123” (exemplo absurdo), o console registra um “MethodFailedException” e seta o valor do atributo no Bean como “null”. Quando o cliente decide não preencher o campo, o atributo também é setado como “null” no Bean. Logo, como informar para o usuário que ele digitou uma data inválida, se o método validate() (que ocorre já com o Bean populado) sempre lê o valor como “null” ?
Entre as alternativas que pensei foram, validar no cliente (antes de validar na Action) ou validar no método setDataNascimento do Bean.
Não entendi por que o teu tratamento de exception seta o valor como null.
Poderia setar uma data padrão, como 01/01/1900, apenas para diferenciar do caso ‘não informado’.
trekkerbr
Olá drsmachado,
Na verdade não fui eu quem setou este valor null, o comportamento que observei é que quando ocorre o MethodFailedException, o valor é setado automaticamente como null no Bean. O método set deste atributo no Bean só contem isso:
public void setDataNascimento(Calendar data) {
this.datanascimento = data;
}
Desta forma, o validate() já recebe um null, sendo por o campo ser invalido ou por ser vazio.
Acredito que posso receber o valor como String no método e fazer um teste antes de definir o valor como Calendar no Bean. Vou fazer um teste e se funcionar eu posto. Obrigado.
drsmachado
Isso está meio esquisito.
Posta aí o código que tu está usando.
trekkerbr
Notei que quando a conversão falha (quando não consegue setar o valor do atributo no Bean), automaticamente é retornado um “input”, e a anotação @Result encaminha novamente para o formulário, onde a tag <s:fielderror> esta mostrando a seguinte mensagem:
“Invalid field value for field pessoa.nascimento”
Quer dizer, já esta sendo realizada uma validação automática para saber se o valor do campo no JSP é compatível com o atributo. Porem em ambas as situações (campo vazio ou inválido) o valor do atributo Nascimento chega no método validate() como “null” e não consigo diferenciar entre os dois erros para mostrar a mensagem correta ao usuário.
publicclassalteraPessoaActionextendsActionSupport{Pessoapessoa;//sets e gets para o objeto pessoa.@Overridepublicvoidvalidate(){System.out.println(this.pessoa.getNascimento());//Esta retornando "null" caso seja vazio ou inválido.}
Se eu bem me lembro, você pode sobrescrever o método validate e personalizar as validações que eventualmente julgar necessárias.
Sendo isto possível, basta tratar, verificando se o valor atribuído à variável que corresponde a data é null ou inválido.
trekkerbr
OK, vou continuar tentando, deve existir uma forma já padronizada de resolver isto.
Por hora a solução é criticar apenas se a data for inválida (permitir que a data seja vazia).