Проверка Java bean против проверки XSD для @Pattern.List

#java #validation #xsd #bean-validation

#java #проверка #xsd #проверка компонента

Вопрос:

Используя krasa-jaxb-tools jaxb-plugin, я сгенерировал следующее:

Из схемы XSD:

 <xs:simpleType name="SomethingId">
    <xs:restriction base="xs:string">
        <xs:pattern value="small.123[A-Za-z0-9.]{0,27}"/>
        <xs:pattern value="SMALL.123[A-Za-z0-9.]{0,27}"/>
    </xs:restriction>
</xs:simpleType>
  

Я получил аннотированный элемент:

     @XmlElement(name = "SomethingId", required = true)
    @NotNull
    @Pattern.List({
    @Pattern(regexp = "small\.123[A-Za-z0-9\.]{0,27}"),
    @Pattern(regexp = "SMALL\.123[A-Za-z0-9\.]{0,27}")
})
protected String somethingId;
  

Валидатор по умолчанию (поставщик — Apache):

  ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        this.validator = factory.getValidator(); 
  

Используя JAXB, я успешно создал действительный XML (который проходит проверку XSD, включая формат вышеупомянутой строки).

Но если я попытаюсь проверить строку, как указано выше, с помощью проверки компонента, она выдает ошибку — если написано «small123», это говорит о том, что она должна быть заглавной (ошибка SMALL.123[A-Za-z0-9.] {0,27} regex) и наоборот.

Вывод заключается в том, что проверка XSD обрабатывает список шаблонов так, как если бы подразумевалось логическое ИЛИ, а проверка bean обрабатывает их как логическое И .

Поскольку это событие произошло только один раз в моем коде, мне удалось его исправить (быстро и грязно), но мне было интересно, есть ли лучший способ.

Это проблема с плагином (который сгенерировал неправильные аннотации), с валидатором или чем-то еще (чего я не заметил)?

Ответ №1:

Да, проблема в плагине.

смотрите здесь https://github.com/krasa/krasa-jaxb-tools/issues/41 (исправлено и объединено в 1.5) и здесь https://github.com/krasa/krasa-jaxb-tools/issues/54

Если вы не используете 1.5, возможно, обновление устраняет вашу проблему. В других случаях вам придется дождаться слияния и выпуска выпуска 54 или применить это исправление в вашем локальном репозитории.