Jsf 如果要在标记中指定不相关的标记属性,则强制XML解析器引发解析错误

Jsf 如果要在标记中指定不相关的标记属性,则强制XML解析器引发解析错误,jsf,xml-parsing,tag-handler,Jsf,Xml Parsing,Tag Handler,我有一个JSF转换器的基本标记处理程序,如下所示(为了简洁起见,省略了一些内容) 它有多个属性,目标是将字符串表示形式转换为等价的java.math.BigDecimal值和java.math.BigDecimal,转换为各种显示格式,如带或不带货币符号的货币、百分比、带分组的数字、小数位数等 当然,在给出的示例中,百分比和货币不能一起使用。因此,以下是完全正确的 <my:convertBigDecimal currency="#{currencyCode}" groupingUsed="

我有一个JSF转换器的基本标记处理程序,如下所示(为了简洁起见,省略了一些内容)

它有多个属性,目标是将字符串表示形式转换为等价的
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文档本身


是否可能以某种方式强制解析器发出解析错误,如果尝试将不相关的属性与给定的标记一起指定,以便可以省略转换器中的几个条件测试,并且可以警告使用转换器的用户或应用程序开发人员不要过早地在标记中使用不相关的属性?

不幸的是,在
.taglib.xml
文件。只有通过
注册的真正的标记处理程序类才能实现


我知道的唯一方法是使用XSD/DTD验证。。。即使如此,互斥属性也只能在XSD 1.1中使用:。因此,您必须创建一个XSD,然后调整运行时解析器并(/或?)配置IDE,以便对xhtml文件进行XSD验证。幸运的是,JSF使用了真正的名称空间,不像HTML5数据松散器。。。也许@BalusC可以在spec组中提出这一点,什么可能是阻止解析错误显示在服务器日志上的最高优先级的可能原因,每当解析器解析XML文档失败时,浏览器上的整个页面都会保持白色?在我的例子中,像这样的XML解析错误在GlassFish和WildFly中都是不可追踪的,可能是从我添加模板开始。我无权在此处留下此评论,但我还无法猜测原因,因为它在单页应用程序中运行良好。webapp本身附带了另一个XML解析器/工厂?我使用Apache POI之类的API,jsoup可能使用自己的解析器,但我自己没有向应用程序添加任何外部XML解析器。这些解析器不会发现这些问题。扩展默认的jsf解析器,在继续之前,检查。。。dtd?xsd?
<my:convertBigDecimal percent="true"
                      currency="#{currencyCode}"
                      useCurrencySymbol="false"
                      groupingUsed="true"
                      locale="#{locale}"/>
<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.");
        }
    }

}