Использование краса-JAXB-инструменты JAXB-плагин, я сгенерировал следующее:
Java проверки боб против проверки XSD для @ Pattern.List
из 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, включая формат вышеупомянутой строки).
Но если я попытаюсь проверить строку, как указано выше, используя проверку Bean, она выдает ошибку - если она написана «small123», она говорит, что она должна быть заглавной (с ошибкой SMALL.123 [A-Za-z0-9.] {0 , 27} regex) и наоборот.
Вывод состоит в том, что проверка XSD рассматривает список шаблонов, как если бы подразумевалось логическое ИЛИ, а проверка валида обрабатывает их как логические И.
Поскольку это событие произошло только один раз в моем коде, мне удалось исправить его (быстро и грязно), но мне было интересно, есть ли лучший способ.
Это проблема с плагином (который генерирует неправильные аннотации), с помощью валидатора или чего-то еще (чего я не замечаю)?