Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2017-03-15T15:58:50+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Valider la combinaison de plusieurs champs, message #1444742017-03-15T15:58:50+01:00artragis/@artragishttps://zestedesavoir.com/forums/sujet/8195/valider-la-combinaison-de-plusieurs-champs/?page=1#p144474<p>Bon, en fait ça marchait pas vraiment, néanmoins j’ai trouvé la solution : </p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="nd">@DocumentOrToken</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">AnalysisInput</span> <span class="kd">implements</span> <span class="n">DocumentContainerEntity</span><span class="o">{</span>
<span class="nd">@ValidUrl</span><span class="o">(</span><span class="n">message</span> <span class="o">=</span> <span class="s">"You need at least a document or a list of tokens."</span><span class="o">)</span>
<span class="nd">@NotNull</span><span class="o">(</span><span class="n">message</span> <span class="o">=</span> <span class="s">"Url must be set."</span><span class="o">)</span>
<span class="nd">@Size</span><span class="o">(</span><span class="n">min</span><span class="o">=</span><span class="mi">4</span><span class="o">)</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">url</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">document</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">List</span><span class="o"><</span><span class="n">TokenInput</span><span class="o">></span> <span class="n">tokens</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">AnalysisInput</span><span class="o">()</span> <span class="o">{</span>
<span class="k">this</span><span class="o">(</span><span class="kc">null</span><span class="o">,</span> <span class="kc">null</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nf">AnalysisInput</span><span class="o">(</span><span class="n">String</span> <span class="n">url</span><span class="o">,</span> <span class="n">String</span> <span class="n">document</span><span class="o">,</span> <span class="n">List</span><span class="o"><</span><span class="n">TokenInput</span><span class="o">></span> <span class="n">token</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">url</span> <span class="o">=</span> <span class="n">url</span><span class="o">;</span>
<span class="k">this</span><span class="o">.</span><span class="na">document</span> <span class="o">=</span> <span class="n">document</span><span class="o">;</span>
<span class="k">this</span><span class="o">.</span><span class="na">tokens</span> <span class="o">=</span> <span class="n">token</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getUrl</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">url</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">hasDocument</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">document</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">&&</span> <span class="o">!</span><span class="s">""</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">document</span><span class="o">);</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">hasToken</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">tokens</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">&&</span> <span class="o">!</span><span class="n">tokens</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">();</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">hasEnoughData</span><span class="o">(){</span>
<span class="k">return</span> <span class="n">hasDocument</span><span class="o">()</span> <span class="o">||</span> <span class="n">hasToken</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>L’interface m’oblige simplement à avoir un "hasToken", "hasDocument" et "hasEnoughData".</p>
<p>Ensuite je crée l’annoation :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="nd">@Target</span><span class="o">({</span><span class="n">ElementType</span><span class="o">.</span><span class="na">TYPE</span><span class="o">,</span> <span class="n">ElementType</span><span class="o">.</span><span class="na">ANNOTATION_TYPE</span><span class="o">})</span>
<span class="nd">@Retention</span><span class="o">(</span><span class="n">RetentionPolicy</span><span class="o">.</span><span class="na">RUNTIME</span><span class="o">)</span>
<span class="nd">@Documented</span>
<span class="nd">@Constraint</span><span class="o">(</span>
<span class="n">validatedBy</span> <span class="o">=</span> <span class="o">{</span><span class="n">ValidContentConstraintValidator</span><span class="o">.</span><span class="na">class</span><span class="o">}</span>
<span class="o">)</span>
<span class="kd">public</span> <span class="nd">@interface</span> <span class="n">DocumentOrToken</span> <span class="o">{</span>
<span class="n">String</span> <span class="nf">message</span><span class="o">()</span> <span class="k">default</span> <span class="s">"${constraint.validation.document_or_token_needed}"</span><span class="o">;</span>
<span class="n">Class</span><span class="o"><?>[]</span> <span class="n">groups</span><span class="o">()</span> <span class="k">default</span> <span class="o">{};</span>
<span class="n">Class</span><span class="o"><?</span> <span class="kd">extends</span> <span class="n">Payload</span><span class="o">>[]</span> <span class="nf">payload</span><span class="o">()</span> <span class="k">default</span> <span class="o">{};</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>pour terminer par le validateur en lui-même :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kd">public</span> <span class="kd">class</span> <span class="nc">ValidContentConstraintValidator</span> <span class="kd">implements</span> <span class="n">ConstraintValidator</span><span class="o"><</span><span class="n">DocumentOrToken</span><span class="o">,</span> <span class="n">DocumentContainerEntity</span><span class="o">></span> <span class="o">{</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">initialize</span><span class="o">(</span><span class="n">DocumentOrToken</span> <span class="n">documentOrToken</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">// Nothing to do</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">isValid</span><span class="o">(</span><span class="n">DocumentContainerEntity</span> <span class="n">documentContainerEntity</span><span class="o">,</span> <span class="n">ConstraintValidatorContext</span> <span class="n">constraintValidatorContext</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">documentContainerEntity</span><span class="o">.</span><span class="na">hasEnoughData</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>Valider la combinaison de plusieurs champs, message #1442892017-03-13T17:34:58+01:00artragis/@artragishttps://zestedesavoir.com/forums/sujet/8195/valider-la-combinaison-de-plusieurs-champs/?page=1#p144289<p>ça donne quelque chose comme ça (j’ai enlevé les fonctions qui servent à rien)</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kd">public</span> <span class="kd">class</span> <span class="nc">AnalysisInput</span> <span class="o">{</span>
<span class="nd">@ValidUrl</span><span class="o">(</span><span class="n">message</span> <span class="o">=</span> <span class="s">"Url is not valid."</span><span class="o">)</span>
<span class="nd">@NotNull</span><span class="o">(</span><span class="n">message</span> <span class="o">=</span> <span class="s">"Url must be set."</span><span class="o">)</span>
<span class="nd">@Size</span><span class="o">(</span><span class="n">min</span><span class="o">=</span><span class="mi">4</span><span class="o">)</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">url</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">document</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">List</span><span class="o"><</span><span class="n">TokenInput</span><span class="o">></span> <span class="n">token</span><span class="o">;</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">hasDocument</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">document</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">&&</span> <span class="o">!</span><span class="s">""</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">document</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">hasToken</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="o">!</span><span class="n">hasDocument</span><span class="o">()</span> <span class="o">&&</span> <span class="o">!</span><span class="n">token</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">();</span>
<span class="o">}</span>
<span class="nd">@AssertTrue</span><span class="o">(</span><span class="n">message</span> <span class="o">=</span> <span class="s">"You need at least a document or a list of tokens."</span><span class="o">)</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">hasEnoughData</span><span class="o">(){</span>
<span class="k">return</span> <span class="n">hasDocument</span><span class="o">()</span> <span class="o">||</span> <span class="n">hasToken</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>Valider la combinaison de plusieurs champs, message #1442872017-03-13T17:17:03+01:00artragis/@artragishttps://zestedesavoir.com/forums/sujet/8195/valider-la-combinaison-de-plusieurs-champs/?page=1#p144287<p>Non, je mets le <code>assertTrue</code> au dessus d’une méthode spécialement créée pour ça.</p>
<p>Ensuite en bindant tout ce qu’il faut, ça fonctionne bien.</p>Valider la combinaison de plusieurs champs, message #1442842017-03-13T16:59:38+01:00lthms/@lthmshttps://zestedesavoir.com/forums/sujet/8195/valider-la-combinaison-de-plusieurs-champs/?page=1#p144284<p>Tu t’en sors comment du coup ? Tu appelles la fonction de vérification à la fin du constructeur ?</p>Valider la combinaison de plusieurs champs, message #1442832017-03-13T16:54:42+01:00artragis/@artragishttps://zestedesavoir.com/forums/sujet/8195/valider-la-combinaison-de-plusieurs-champs/?page=1#p144283<p>Bon, ton approche naïve fonctionne, merci beaucoup <img alt=":)" src="/static/smileys/smile.png"></p>Valider la combinaison de plusieurs champs, message #1442722017-03-13T12:09:17+01:00lthms/@lthmshttps://zestedesavoir.com/forums/sujet/8195/valider-la-combinaison-de-plusieurs-champs/?page=1#p144272<p>Pas de souci, c’est normal. J’ai regardé rapidement sur Github, je n’ai pas trouvé d’exemples concrets qui utilisent l’approche naïve que je propose, mais je n’ai pas non plus beaucoup cherché.</p>Valider la combinaison de plusieurs champs, message #1442702017-03-13T11:52:17+01:00artragis/@artragishttps://zestedesavoir.com/forums/sujet/8195/valider-la-combinaison-de-plusieurs-champs/?page=1#p144270<blockquote>
<p>Juste pour être sur, ce que tu demandes, c’est comment utiliser l’API javax.validation.constraints pour ajouter cette contrainte ?</p>
</blockquote>
<p>En effet.</p>
<blockquote>
<p>Je ne connais pas cette API, les résultats sont checkés à l’appel de la fonction annotée ?</p>
</blockquote>
<p>je continue mes recherches et il semblerait, en effet que l’utilisation d’annotation sur une fonction soit possible, j’attends néanmoins qu’une personne qui a plus l’habitude réponde. Mais merci pour la piste lthms <img alt=":)" src="/static/smileys/smile.png"></p>Valider la combinaison de plusieurs champs, message #1442682017-03-13T11:38:28+01:00lthms/@lthmshttps://zestedesavoir.com/forums/sujet/8195/valider-la-combinaison-de-plusieurs-champs/?page=1#p144268<blockquote>
<p>Globalement, je veux que <code>hasDocument</code> et <code>hasToken</code> ne puisse pas être faux en même temps.</p>
</blockquote>
<p>C’est la définition du ou logique (<code>||</code>). Juste pour être sur, ce que tu demandes, c’est comment utiliser l’API javax.validation.constraints pour ajouter cette contrainte ?</p>
<p><strong>Edit :</strong> une solution pourrait être d’écrire une troisième méthode <code>checkSpecs</code> qui rende un booléen (<code>hasDocument || hasToken</code>) et d’utiliser la contrainte <code>AssertTrue</code> pour vérifier son retour…</p>
<p>Je ne connais pas cette API, les résultats sont checkés à l’appel de la fonction annotée ?</p>Valider la combinaison de plusieurs champs, message #1442672017-03-13T11:24:30+01:00artragis/@artragishttps://zestedesavoir.com/forums/sujet/8195/valider-la-combinaison-de-plusieurs-champs/?page=1#p144267<p>Bonjour,</p>
<p>Je suis en train (pour le boulot), de créer une API rest en java avec jetty, hk2 comme IOC, et java 8.</p>
<p>Je me trouve coincé lorsqu’il faut que je valide mes ressources d’entrée. En effet fonctionnellement parlant il m’est spécifié que deux champs peuvent être nuls mais pas les deux en même temps. J’aimerais pouvoir intégrer cette contrainte dans le flux de validation que permet JAX-RS avec l’API javax.validation.constraints.</p>
<p>Voici ma ressource de base (StatusType est une énum):</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kd">public</span> <span class="kd">class</span> <span class="nc">AnalysisInput</span> <span class="o">{</span>
<span class="nd">@javax.validation.constraints.Pattern</span><span class="o">(</span><span class="n">regexp</span> <span class="o">=</span> <span class="s">"^(?:(?:https?|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?!10(?:\\.\\d{1,3}){3})"</span> <span class="o">+</span>
<span class="s">"(?!127(?:\\.\\d{1,3}){3})(?!169\\.254(?:\\.\\d{1,3}){2})(?!192\\.168(?:\\.\\d{1,3}){2})"</span> <span class="o">+</span>
<span class="s">"(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])"</span> <span class="o">+</span>
<span class="s">"(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))"</span> <span class="o">+</span>
<span class="s">"|(?:(?:[a-z\\x{00a1}-\\x{ffff}0-9]+-?)*[a-z\\x{00a1}-\\x{ffff}0-9]+)"</span> <span class="o">+</span>
<span class="s">"(?:\\.(?:[a-z\\x{00a1}-\\x{ffff}0-9]+-?)*[a-z\\x{00a1}-\\x{ffff}0-9]+)*(?:\\.(?:[a-z\\x{00a1}-\\x{ffff}]{2,})))"</span> <span class="o">+</span>
<span class="s">"(?::\\d{2,5})?(?:/[^\\s]*)?$_iuS"</span><span class="o">,</span> <span class="n">message</span> <span class="o">=</span> <span class="s">"Url is not valid."</span><span class="o">)</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">url</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">document</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">List</span><span class="o"><</span><span class="n">TokenInput</span><span class="o">></span> <span class="n">token</span><span class="o">;</span>
<span class="c1">// constructeur + accesseur </span>
<span class="c1">// ...</span>
<span class="c1">//</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">hasDocument</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">document</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">&&</span> <span class="o">!</span><span class="s">""</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">document</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">hasToken</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="o">!</span><span class="n">isDocument</span><span class="o">()</span> <span class="o">&&</span> <span class="o">!</span><span class="n">token</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>Globalement, je veux que <code>hasDocument</code> et <code>hasToken</code> ne puisse pas être faux en même temps.</p>
<p>Comment puis-je faire?</p>