Заставить синтаксический анализатор XML выдавать ошибку разбора, если в теге должны быть указаны нерелевантные атрибуты тега

У меня есть базовый обработчик тегов для JSF-конвертера следующим образом (некоторые вещи были опущены для краткости).

<tag>
    <description>
        <![CDATA[
            Converts a string representation to 
            <code>java.math.BigDecimal</code> based on attribute values given.
        ]]>
    </description>
    <tag-name>convertBigDecimal</tag-name>
    <converter><converter-id>bigDecimalConverter</converter-id></converter>

    <attribute>
        <description>
            <![CDATA[
                <a href="https://en.wikipedia.org/wiki/ISO_4217">ISO 4217 currency code</a> such as INR, USD, GBP, NZD etc.
            ]]>
        </description>
        <name>currency</name>
        <type>java.lang.String</type>
    </attribute>

    <attribute>
        <description>
            <![CDATA[
                A boolean value or flag indicating whether to transform 
                this value to percentage or not. The default is false.
            ]]>
        </description>
        <name>percent</name>
        <type>java.lang.Boolean</type>
    </attribute>

    <attribute>
        <description>
            <![CDATA[
                A boolean value or flag indicating whether to use a 
                currency symbol (such as $) or not. The default is true.
            ]]>
        </description>
        <name>useCurrencySymbol</name>
        <type>java.lang.Boolean</type>
    </attribute>

    <!-- Other attributes. -->
</tag>

Он имеет несколько атрибутов и предназначен для преобразования строкового представления в его эквивалент java.math.BigDecimal значение и java.math.BigDecimal к различным форматам отображения, таким как валюта с или без символа валюты, проценты, числа с группировкой, количество десятичных знаков в дробных числах и т. д.

Естественно, процент и валюта не могут использоваться вместе в приведенном примере. Итак, следующее совершенно верно.

<my:convertBigDecimal currency="#{currencyCode}" groupingUsed="true" locale="#{locale}"/>

Следующее, однако, будет недействительным и, как ожидается, вызовет ошибку разбора, если попытаться.

<my:convertBigDecimal percent="true"
                      currency="#{currencyCode}"
                      useCurrencySymbol="false"
                      groupingUsed="true"
                      locale="#{locale}"/>

Если, например, percent атрибут должен был предприниматься вместе с любыми другими атрибутами, связанными с такими валютами, как currency, useCurrencySymbolзатем предполагается, что анализатор XML должен выдать ошибку синтаксического анализа, не позволяющую проанализировать сам документ XML.

Можно ли каким-то образом заставить синтаксический анализатор выдать ошибку синтаксического анализа, если попытаться указать нерелевантные атрибуты вместе с данным тегом, чтобы можно было пропустить несколько условных тестов в конвертере, а пользователи или разработчики приложений, использующие конвертер, могут быть предупрежденным против использования нерелевантных атрибутов в теге слишком рано?

1 ответ

Решение

К сожалению, не с помощью конфигурации XML в .taglib.xml файл. Это возможно только через реальный класс обработчика тегов, зарегистрированный через <converter><handler-class>,

<converter>
    <converter-id>bigDecimalConverter</converter-id>
    <handler-class>com.example.BigDecimalConverterHandler</handler-class>
</converter>

public class BigDecimalConverterHandler extends ConverterHandler {

    public BigDecimalConverterHandler(ConverterConfig config) {
        super(config);

        if (getAttribute("percent") != null && getAttribute("currency") != null) {
            throw new IllegalArgumentException("Hey there, it does not make sense to specify both 'percent' and 'currency' attributes.");
        }
    }

}
Другие вопросы по тегам