Pergunta

O problema que estou tendo é que meu A validação de feijão não está funcionando como eu esperaria.

Eu tenho um feijão gerenciado com escopo de sessão com um name campo que está ligado a um h:inputText. O nome deve ser inserido e ter um comprimento mínimo de 1 caractere e um comprimento máximo de 5 caracteres. Espero que, quando digite o nome na caixa de texto, ele seja validado de acordo com o feijão de apoio e, se falhar, ele exibirá as mensagens de erro correspondentes.

No entanto, este não é o caso. As validações estão sempre falhando, mesmo se eu inserir um caso válido no InputText (por exemplo, "ABC"). Ao depurar o aplicativo, parece que o getName() O acessador é sempre chamado, e o setter nunca é alcançado. Estou fazendo algo errado? Presumo que o validador use o acessador para validar, mas o problema é que o setter nunca tem a chance de atualizar o valor do nome ... devo estar perdendo alguma coisa.

Abaixo está o feijão gerenciado:

@ManagedBean
@SessionScoped
public class James implements Serializable {

  public James() {
    super();
   }

  private String name;

  @NotNull
  @Min(value = 1)
  @Max(value = 5)
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

Abaixo está o fragmento do JSF XHTML. Eu tentei algumas variações diferentes com formulários separados, mas a primeira opção é a que eu suponho para trabalhar (acho que é equivalente à terceira opção, mas tentei apenas por caso :))

<h:messages/>
<h:form>
  <h:inputText id="jamesName" value="#{james.name}"/>
  <h:message for="jamesName"/>
  <h:commandButton value="submit"/>
</h:form>
<h:form>
  <h:inputText id="jamesName" value="#{james.name}" immediate="true"/>
  <h:message for="jamesName"/>
  <h:commandButton value="submit"/>
</h:form>
<h:form>
  <h:inputText id="jamesName" value="#{james.name}">
    <f:validateBean />
  </h:inputText>
  <h:message for="jamesName"/>
  <h:commandButton value="submit"/>
</h:form>

Estou usando o JSF 2.0.2-FCS com o Hibernate Entity Manager 3.3.2.ga e o Hibernate Validator 4.0.2.ga (abaixo estão as peças relevantes do meu MAVEN POM), executando no Tomcat 6.0.20 no serviço Windows XP Pro Pacote 3 (32 bits).

<dependency>
  <groupId>javax.faces</groupId>
  <artifactId>jsf-api</artifactId>
  <version>2.0.2-FCS</version>
</dependency>
<dependency>
  <groupId>javax.faces</groupId>
  <artifactId>jsf-impl</artifactId>
  <version>2.0.2-FCS</version>
</dependency>
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>
<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.1</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>3.3.2.GA</version>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>4.0.2.GA</version>
</dependency>
Foi útil?

Solução

Sua validação está funcionando corretamente. O problema é com suas anotações @min e @max:

@NotNull
@Min(value = 1)
@Max(value = 5)
public String getName() {
    return name;
}

@Min e @max são destinados a comparação numérica. Você escreveu:

O nome deve ser inserido e ter um comprimento mínimo de 1 caractere e um comprimento máximo de 5 caracteres

Você deve usar a anotação @size, como em:

@NotNull
@Size(min = 1, max = 5)
public String getName() {
    return name;
}

Os campos de feijão não são atualizados porque a validação falha. Somente após o sucesso da validação, o feijão será atualizado.

Outras dicas

Quanto à sua pergunta adicional - Veja esta matriz - Não, eles não são compatíveis.

Sobre a pergunta do JSF - verifique os logs do Tomcat e o console do Javascript do Firefox.

Para aumentar um erro de compilação nesse tipo de caso, podemos usar o processador de anotação do validador do Hibernate.Validador de Hibernato

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top