带消息的 Hibernate 约束映射验证器

Hibernate constraint-mapping validator with message

这是validation.xml

<constraint-mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.1.xsd"
                 xmlns="http://jboss.org/xml/ns/javax/validation/mapping" version="1.1">
<default-package>com.esq.rbac.model</default-package>
<bean class="Tenant" ignore-annotations="true">
    ...
    <field name="ivrPin">
        <constraint annotation="javax.validation.constraints.Size">
            <element name="min">6</element>
            <element name="max">6</element>
            <message>IVR Pin must be 6 digit numeric</message>
        </constraint>
        <constraint annotation="javax.validation.constraints.Pattern">
            <element name="regexp">[0-9]+</element>
        </constraint>
    </field>
</bean>

在执行期间收到错误提示

c.e.u.imports.Main [run] - HV000115: Error parsing mapping file.
javax.validation.ValidationException: HV000115: Error parsing mapping file.
Caused by: org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: 
Invalid content was found starting with element 'message'. One of '{"http://jboss.org/xml/ns/javax/validation/mapping":element}' is expected.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)

如何正确包含错误信息

您只需将 message 直接放在 constraint annotation 标签之后,element 标签之前,进行一项更改。

<bean class="Tenant" ignore-annotations="true">
...
<field name="ivrPin">
    <constraint annotation="javax.validation.constraints.Size">
        <message>IVR Pin must be 6 digit numeric</message>
        <element name="min">6</element>
        <element name="max">6</element>

    </constraint>

原因如下:

如果您查看 xsd 文件以进行验证映射:

验证-映射-1.1.xsd

<xs:complexType name="constraintType">
    <xs:sequence>
        <xs:element type="xs:string" name="message" minOccurs="0"/>
        <xs:element type="map:groupsType"
                    name="groups"
                    minOccurs="0"/>
        <xs:element type="map:payloadType"
                    name="payload"
                    minOccurs="0"/>
        <xs:element type="map:elementType"
                    name="element"
                    maxOccurs="unbounded"
                    minOccurs="0"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="annotation" use="required"/>
</xs:complexType>

它使用了 xs:sequence 标签,指定子元素必须按顺序出现。参考element sequence。这里 message 属性出现在其他属性之前,例如 groupspayloadelement.