Bonjour

Je travaille actuellement avec Seam 2.2 et je rencontre un problème avec la validation dans un cas précis. J'ai 2 champs représentant des pourcentages et donc la valeur doit être comprise entre 0 et 100. J'utilise donc l'annotation "@Range" sur ma classe Java :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
public class Produit implements Serializable
{
	@Column(name = "BINFPP")
	@Range(min = 0, max = 100)
	private Double percentMin;
 
	@Column(name = "BSUPPP")
	@Range(min = 0, max = 100)
	private Double percentMax;
}
En complément, mon champ "percentMax" doit être supérieur à mon champ "percentMin", je vais pour cela utiliser le tag <s:validateEquality/> dans ma page XHTML pour effectuer la validation :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<s:decorate id="percentMin" template="/layout/field/edit.jspx">
	<ui:define name="label">#{messages['myPage.label.percentMin']}</ui:define>
	<h:inputText value="#{product.percentMin}"
		id="percentMinInput"
		label="#{messages['myPage.label.percentMin']}"
		required="true">
 
	</h:inputText>
</s:decorate>
 
<s:decorate id="percentMax" template="/layout/field/edit.jspx">
	<ui:define name="label">#{messages['myPage.label.percentMax']}</ui:define>
	<h:inputText value="#{product.percentMax}"
		id="percentMaxInput"
		label="#{messages['myPage.label.percentMax']}"
		required="true">
 
		<s:validateEquality for=":#{rich:clientId('percentMinInput')}"
			operator="greater_or_equal"/>
 
	</h:inputText>
</s:decorate>
Précisons que les <s:decorate/> ajoute des <s:validateAll/> sur tous mes inputs afin de tester l'annotation "@Range". Et c'est là que le problème arrive : si la valeur du champ "percentMin" n'est pas dans le range requis (par exemple "-1"), cela va retourner une valeur "null" qui sera ensuite utilisée par <s:validateEquality/>, lequel lancera une NullPointerException. Si on regarde plus en détail le code de la classe EqualityValidator de Seam, on peut voir :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException
{
	...
	if (value == null && other == null)
	{
		// Thats fine
	}
	else if (value != null)
	{
		// Do the test
	}
}
Où "value" correspond au champ "percentMax" et "other" à "percentMin". Alors même si on est d'accord que vérifier que "value" doit être non null, on devrait également regarder "other". Dans mon idée, si "other" est null (mais pas "value") alors seuls les tests d'égalité et de non égalité devraient avoir lieu. Les comparaisons, faisant toutes appel à la méthode "compare", propageront sinon des NullPointerException.

Si quelqu'un à une idée pour résoudre le soucis ou comment le contourner pour valider mes champs, merci d'avance.