You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by Apache Wiki <wi...@apache.org> on 2010/03/03 18:51:38 UTC
[Myfaces Wiki] Update of "Extensions/Validator/DevDoc/Drafts" by GerhardPetracek
Dear Wiki user,
You have subscribed to a wiki page or wiki category on "Myfaces Wiki" for change notification.
The "Extensions/Validator/DevDoc/Drafts" page has been changed by GerhardPetracek.
http://wiki.apache.org/myfaces/Extensions/Validator/DevDoc/Drafts?action=diff&rev1=15&rev2=16
--------------------------------------------------
* @EmptyIf (see EXTVAL-75)
* @DateRange
* @Expression
+ * @ConstraintSource
+ * @TargetProperty
+ * @TargetPropertyId
+ * @IgnoreConstraintSource
==== Details about @Expression ====
@@ -23, +27 @@
moreover, @Expression should provide an attribute which points to the expression evaluator. so it's possible to create custom expressions by providing a custom evaluator. See also the ReferenceResolver idea, maybe expression evaluator could build further on that basis.
furthermore, it should also work for component initialization.
+
+ ==== Details about @ConstraintSource ====
+ It should be possible to expose constraints through DTO's.
+
+ Example entities:
+ {{{
+ @Entity
+ public class User extends AbstractDomainObject
+ {
+ @NotNull @Column @Size(min = 2, max = 64)
+ private String firstName;
+
+ @NotNull @Column @Size(min = 2, max = 64)
+ private String lastName;
+
+ @ManyToMany(mappedBy = "users")
+ private List<Group> groups = new ArrayList<Group>();
+ //...
+ }
+
+ @Entity
+ public class Group extends AbstractDomainObject
+ {
+ @NotNull @Column @Size(min = 2, max = 14)
+ private String name;
+
+ @ManyToMany(cascade = CascadeType.PERSIST)
+ private List<User> users = new ArrayList<User>();
+ //...
+ }
+ }}}
+
+ ===== Use-Case 1 =====
+ {{{
+ @ConstraintSource(User.class)
+ public class UserDTO
+ {
+ private String firstName; //mapped automatically to User#firstName
+ private String lastName; //mapped automatically to User#lastName
+
+ //...
+ }
+ }}}
+
+ ===== Use-Case 2 =====
+ {{{
+ @ConstraintSource(User.class)
+ public class UserDTO
+ {
+ @IgnoreConstraintSource
+ @Size(min = 2, max = 32)
+ private String firstName; //no mapping - constraints of the current property are used
+
+ @TargetProperty("lastName")
+ private String surName; //mapped to User#lastName
+
+ //...
+ }
+ }}}
+
+ ===== Use-Case 3 =====
+ {{{
+ @ConstraintSource(User.class)
+ public class UserDTO
+ {
+ //...
+
+ @ConstraintSource(Group.class)
+ private String name; //mapped to Group#name
+ }
+ }}}
+
+ ===== Use-Case 4 =====
+ {{{
+ @ConstraintSource(User.class)
+ public class UserDTO
+ {
+ //...
+
+ @ConstraintSource(Group.class)
+ @TargetProperty("name")
+ private String defaultGroupName; //mapped to Group#name
+ }
+ }}}
+
+ ===== Use-Case 5 =====
+ {{{
+ @Entity
+ public class User extends AbstractDomainObject
+ {
+ @NotNull @Column @Size(min = 2, max = 64)
+ private String firstName;
+
+ @LastName @NotNull @Column @Size(min = 2, max = 64)
+ private String lastName;
+ }
+
+ @Target({METHOD, FIELD})
+ @Retention(RUNTIME)
+ @interface LastName {
+ }
+
+ @ConstraintSource(User.class)
+ public class UserDTO
+ {
+ //...
+
+ @ConstraintSource(User.class)
+ @TargetPropertyId(LastName.class)
+ private String surName; //mapped to User#lastName
+ }
+ }}}
----