#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 или применить это исправление в вашем локальном репозитории.