【问题标题】:JAXB generated simple type missing restrictionJAXB 生成的简单类型缺失限制
【发布时间】:2013-11-26 15:10:38
【问题描述】:

我目前正在生成我的第一个 JAXB 数据绑定。我有一个架构,其中包含一个 xs:simpleType:

<xs:simpleType name="NINumberType">
    <xs:restriction base="xs:string">
        <xs:pattern value="[A-Z]{2}\d{6}[A-D]{0,1}"/>
    </xs:restriction>
</xs:simpleType>

在我的 binding.xjb 中有这个:

<jxb:bindings version="1.0"
     xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
     jxb:extensionBindingPrefixes="xjc">

     <jxb:bindings schemaLocation="mySchema.xsd" node="/xs:schema">
         <jxb:globalBindings mapSimpleTypeDef="true" />
         <jxb:schemaBindings>
             <jxb:package name="com.company.jaxb.mySchema"/>
         </jxb:schemaBindings>
     </jxb:bindings>

</jxb:bindings>

然后,通过 Eclipse(以及 RAD 7.5)我右键单击模式,然后选择 Generate->Java。这会按预期生成数据绑定对象,但 NINumberType 没有内置限制:

/**
 * <p>Java class for NINumberType simple type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;simpleType name="NINumberType">
 *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
 *     &lt;pattern value="[A-Z]{2}\d{6}[A-Z]{0,1}"/>
 *   &lt;/restriction>
 * &lt;/simpleType>
 * </pre>
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "NINumberType", propOrder = {"value"})
public class NINumberType {
    @XmlValue
    protected String value;

    public String getValue() {return value;}
    public void setValue(String value) {this.value = value;}
}

没有提到在我的模式中指定的正则表达式限制,除了在类级别的 javadoc 中。 JAXB 似乎拥有生成限制代码所需的信息,但并未使用它。谁能帮我确保生成了限制代码,这样尝试绑定格式错误的 NI 号码会失败?

【问题讨论】:

    标签: java jaxb


    【解决方案1】:

    JAXB 不会在 Java 模型中生成这些限制。如果您希望在与 XML 的转换期间强制执行此约束,则可以在 Marshaller/Unmarshaller 上指定 javax.xml.validation.Schema 的实例。

    更多信息


    您也许可以找到一个 XJC 扩展,它利用 JSR-303 之类的东西来进行验证约束。以下链接可能会有所帮助:

    【讨论】:

    • 谢谢布莱斯,这很有道理。显然与我使用的其他绑定技术不同。
    • @ChrisKnight - 目标是让 JAXB 使用 POJO。为方便起见,添加了到 Java 生成的模式。
    • 链接已失效。 github.com/krasa/krasa-jaxb-tools 应该很有用。
    【解决方案2】:

    你也可以看看xjc插件https://github.com/krasa/krasa-jaxb-tools

    通过文档它支持XJsr303Annotations并且可以生成:

    • @Valid 所有复杂类型的注释,可以进一步限制为只为定义模式中的类型生成:-XJsr303Annotations:targetNamespace=http://www.foo.com/bar
    • @NotNull 注释用于具有 MinOccur 值 >= 1 的对象或用于需要使用的属性
    • @Size 用于具有 minOccurs &gt; 1 的列表
    • @Size 如果有 maxLengthminLength 或长度限制
    • @DecimalMaxmaxInclusive 限制
    • @DecimalMinminInclusive 限制
    • @DecimalMax 用于 maxExclusive 限制,启用新参数 (inclusive=false) 与:-XJsr303Annotations:JSR_349=true
    • @DecimalMin 用于 minExclusive 限制,启用新参数 (inclusive=false) 与:-XJsr303Annotations:JSR_349=true
    • @Digits 如果有 totalDigitsfractionDigits 限制。
    • @Pattern 如果有 Pattern 限制

    如果您想知道如何在构建环境中使用 XJC 插件(antmavengradle),我建议您查看另一个插件的示例:immutable-xjc

    所以我希望它有所帮助。

    Generation of XSD restrictions in a schema generated from Java JAXB annotated classes相关

    【讨论】:

      猜你喜欢
      • 2012-09-25
      • 2015-09-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      相关资源
      最近更新 更多