[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