Validação Struts

6 respostas
trekkerbr

Bom dia pessoal,

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.

Qual a melhor prática neste caso ?

Obrigado!!

6 Respostas

drsmachado

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.

Abaixo os trechos que penso serem relevantes :

Bean:

public class Pessoa{
private Calendar Nascimento;

public void setNascimento(Calendar data) {
        this.Nascimento = data;
}

public Calendar getNascimento() {
	return Nascimento;
}
}

Action:

public class alteraPessoaAction extends ActionSupport{
Pessoa pessoa;
//sets e gets para o objeto pessoa.
@Override
public void validate(){ 
	System.out.println(this.pessoa.getNascimento()); //Esta retornando "null" caso seja vazio ou inválido.
}

JSP:

Data de nascimento: <input type="text" name="pessoa.nascimento"/>
	<s: fielderror fieldName="pessoa.nascimento">
drsmachado

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).

Obrigado :slight_smile:

Criado 10 de maio de 2012
Ultima resposta 10 de mai. de 2012
Respostas 6
Participantes 2