[hibernate-dev] [Bean Validation] XML Mapping schema

Emmanuel Bernard emmanuel at hibernate.org
Wed Jan 21 23:37:39 EST 2009


I looked at the OVAL schema and as usual there are good stuffs here, I  
also added some missing elements
  - I forgot the flag to be able to ignore existing annotations
  - I forgot the @Valid equivalent
  - OVal has the ability to describe OVal specific constraints in a  
typesafe way but not custom user constraints (as far as I can see).

Let me know what you think, especially on the constraints declarations  
options.

Ignore Annotation flag
Should the ignore-annotation flag be a <bean/> level attribute only or  
should a user be able to define it at the field/method/class level?
If set to true, annotations placed on the bean, field or getter will  
not be considered. If set to false, they will.

@Valid
<valid/>
will indicate that a field or a getter is to be cascaded

Constraints declarations
In the current schema proposal, here is how constraints are declared

            <constraint annotation="com.acme.validate.SafeCustomer">
                <attribute name="category">
                    <array- 
element>com.acme.validate.SecurityLevel.SECURED_COUNTRY</array-element>
                    <array- 
element>com.acme.validate.SecurityLevel.SECURED_ADDRESS</array-element>
                    <array- 
element>com.acme.validate.SecurityLevel.SECURED_FINANCIALS</array- 
element>
                </attribute>
                <attribute name="failPerCategory">false</attribute>
            </constraint>
            <constraint  
annotation="javax.validation.constraint.NotNull">
                <message>blah</message>
            </constraint>

We could enhance this in two ways:
  - provide type-safe support for built-in validations:
<not-null/>,
<min>
   <value>3</value>
   <message>blah</message>
</min>
etc
  - allow custom constraints support in a type-safe way:

The second point would work as followed
  - a constraint annotation would be associated with a given XML type  
eg. <Min/>
  - propose an abstract constraintType XML type that any constraint  
declared in XML would inherit (Min would extend ConstraintType)
  - thanks to that message and groups would be inherited
  - Min would have an attribute "annotation" fixed to the f.q.c.n of  
the corresponding annotation (I haven't find a way to hide it from the  
user but still have it present at parsing time)
  - subelements of a constraint XML element would represent attributes  
of the annotation (with the same name)

<?xml version="1.0" encoding="UTF-8"?>
<validation-mappings
   xmlns="http://jboss.com/java/validation-mapping"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:appval="http://acme.com/appval"
   xsi:schemaLocation="http://jboss.com/java/validation-mapping  
validation-mapping.xsd">
     <default-package>com.acme.dvdstore.model</default-package>
     <bean class="Customer" ignore-annotations="true">
         <class>
             <constraint annotation="com.acme.validate.SafeCustomer">
                 <attribute name="category">
                     <array- 
element>com.acme.validate.SecurityLevel.SECURED_COUNTRY</array-element>
                     <array- 
element>com.acme.validate.SecurityLevel.SECURED_ADDRESS</array-element>
                     <array- 
element>com.acme.validate.SecurityLevel.SECURED_FINANCIALS</array- 
element>
                 </attribute>
                 <attribute name="failPerCategory">false</attribute>
             </constraint>
         </class>
         <fields>
             <field name="firstname">
                  <valid/>
                 <appval:min  
annotation="javax.validation.constraint.Min">
                     <message>blah</message>
                     <value>4</value>
                 </appval:min>
                 <constraint annotation="javax.validation.Min">
                     <message>{error.tooSmall}</message>
                     <groups>
                         <group>javax.validation.groups.Default</group>
                     </groups>
                     <attribute name="value">45</attribute>
                 </constraint>
             </field>
         </fields>
         <getters>
             <getter name="firstname">
                 <ignore-annotations/>
                 <stop-inheritance/>
                 <constraint annotation="javax.validation.Min">
                     <message>{error.tooSmall}</message>
                     <groups>
                         <group>javax.validation.groups.Default</group>
                     </groups>
                     <attribute name="value">45</attribute>
                 </constraint>
             </getter>
         </getters>
     </bean>
</validation-mappings>


where app:val is described in the XSD as
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified"  
elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema 
" version="1.0"
         xmlns:bv="http://jboss.com/java/validation-mapping">
   <xs:element name="min" type="minType"/>

     <xs:complexType name="minType">
         <xs:complexContent>
             <xs:extension base="bv:AbstractConstraintType">
                 <xs:sequence>
                     <xs:element name="value" type="xs:int"  
minOccurs="1"/>
                 </xs:sequence>
                 <xs:attribute name="annotation" use="required"  
fixed="javax.validation.constraint.Min"/>
             </xs:extension>
         </xs:complexContent>
     </xs:complexType>
</xs:schema>

On  Jan 19, 2009, at 19:35, Emmanuel Bernard wrote:

> Here is my very first attempt to describe the constraint mapping XML  
> schema.
> I did not look at other product approach to avoid being tainted. If  
> you have examples of alternative approach, I would appreciate a link.
>
> A couple of comments:
> - I would have preferred a Web Beans style XML approach but this  
> kind of approach is getting some heavy resistance from some members  
> of the expert committee. So I fell back to a more classic approach.
> - constraints themselves cannot be defined: you have to write an  
> actual annotation. I wonder if we should provide such model. At  
> minimal we might want to provide a way to override the constraint  
> validator for a given constraint.
> - I used JPA 2 mapping schema as inspiration
> - I stayed very close to the Java structure
>
> Better names, enhancements, alternative proposals are welcome.
>
> Emmanuel
>
> <?xml version="1.0" encoding="UTF-8"?>
> <validation-mappings>
>   <package>com.acme.dvdstore.model</package>
>   <bean class="Customer">
>       <class>
>           <constraint annotation="com.acme.validate.SafeCustomer">
>               <attribute name="category">
>                   <array- 
> element>com.acme.validate.SecurityLevel.SECURED_COUNTRY</array- 
> element>
>                   <array- 
> element>com.acme.validate.SecurityLevel.SECURED_ADDRESS</array- 
> element>
>                   <array- 
> element>com.acme.validate.SecurityLevel.SECURED_FINANCIALS</array- 
> element>
>               </attribute>
>               <attribute name="failPerCategory">false</attribute>
>           </constraint>
>       </class>
>       <fields>
>           <field name="firstname">
>               <ignore-annotations/>
>               <stop-inheritance/>
>               <constraint annotation="javax.validation.Min">
>                   <message>{error.tooSmall}</message>
>                   <groups>
>                       <group>javax.validation.groups.Default</group>
>                   </groups>
>                   <attribute name="value">45</attribute>
>               </constraint>
>           </field>
>       </fields>
>       <getters>
>           <getter name="firstname">
>               <ignore-annotations/>
>               <stop-inheritance/>
>               <constraint annotation="javax.validation.Min">
>                   <message>{error.tooSmall}</message>
>                   <groups>
>                       <group>javax.validation.groups.Default</group>
>                   </groups>
>                   <attribute name="value">45</attribute>
>               </constraint>
>           </getter>
>       </getters>
>   </bean>
> </validation-mappings>
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/hibernate-dev/attachments/20090121/46e12cb5/attachment.html 


More information about the hibernate-dev mailing list