Заставить синтаксический анализатор 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.");
}
}
}