系统迁移报This parser does not support specification “null“ version “null“

部署灰度环境时,因commons-digester不同版本冲突,导致服务启动失败。通过调整jar包加载顺序,删除1.7版本,保留2.1版本,成功解决java.lang.UnsupportedOperationException错误。

今天部署灰度环境,使用以前的程序jar包,启动报错(java.lang.UnsupportedOperationException: This parser does not support specification "null" version "null"),
经查证是由于commons-digester程序包冲突导致(可能是其他jar冲突,仔细检查),删除commons-digester-1.7.jar重启服务,仍然报同样错误,还原删除commons-digester-2.1.jar,然后重启,服务正常无报错。


jar加载顺序:加载jar包和配置文件的时候,排在前面的classpath被加载,后面的将不会被加载,加载顺序和jar的顺序不同的机器,在JVM启动时,加上如下参数:-verbose:class参数可以查看class从哪个jar加载的,ps
原来的进程加载顺序:/home/lib/commons-digester-1.7.jar,/home/lib/commons-digester-2.1.jar
迁移后进程的加载顺序:/home/lib/commons-digester-2.1.jar,/home/lib/commons-digester-1.7.jar

报错冲突的程序:
[root@ea066cec59a1 lib]# ls -lrt|grep -i Digester
-rw-r----- 1 root root   139966 Apr 14  2019 commons-digester-1.7.jar
-rw-r----- 1 root root   196768 Apr 15  2019 commons-digester-2.1.jar


报错堆栈:
[2020-07-30 13:00:11,650] [main] (Digester.java:794) ERROR org.apache.commons.digester.Digester - Digester.getParser: 
java.lang.UnsupportedOperationException: This parser does not support specification "null" version "null"
        at javax.xml.parsers.SAXParserFactory.setSchema(SAXParserFactory.java:394)
        at org.apache.commons.digester.Digester.getFactory(Digester.java:541)
        at org.apache.commons.digester.Digester.getParser(Digester.java:791)
        at org.apache.commons.digester.Digester.getXMLReader(Digester.java:1068)
        at org.apache.commons.digester.Digester.parse(Digester.java:1916)
        at com.xx.xxx.complex.xml.XMLHelper.createDefaults(XMLHelper.java:320)
        at com.xx.xxx.complex.xml.XMLHelper.getInstance(XMLHelper.java:83)
        at com.xx.xxx.complex.datasource.DataSourceFactory.<clinit>(DataSourceFactory.java:23)
        at com.xx.xxxx.Startup.contextInitialized(Startup.java:25)
        at com.xx.xxxx.Startup.main(Startup.java:67)
07-30 13:00:11.650 org.apache.commons.digester.Digester ERROR - Digester.getParser: 
java.lang.UnsupportedOperationException: This parser does not support specification "null" version "null"
        at javax.xml.parsers.SAXParserFactory.setSchema(SAXParserFactory.java:394)
        at org.apache.commons.digester.Digester.getFactory(Digester.java:541)
        at org.apache.commons.digester.Digester.getParser(Digester.java:791)
        at org.apache.commons.digester.Digester.getXMLReader(Digester.java:1068)
        at org.apache.commons.digester.Digester.parse(Digester.java:1916)
        at com.xx.xxx.complex.xml.XMLHelper.createDefaults(XMLHelper.java:320)
        at com.xx.xxx.complex.xml.XMLHelper.getInstance(XMLHelper.java:83)
        at com.xx.xxx.complex.datasource.DataSourceFactory.<clinit>(DataSourceFactory.java:23)
        at com.xx.xxxx.Startup.contextInitialized(Startup.java:25)
        at com.xx.xxxx.Startup.main(Startup.java:67)

<think>好的,我现在需要解释一下`parser.getAttributeBoolean(null, xxx, false)`这个方法的含义和用法。首先,我得确认用户提到的parser具体指的是哪个类,因为在Android开发中有不同的解析器,比如XmlPullParser或者AttributeSet等。不过通常情况下,处理属性时会用到AttributeSet或者类似的资源解析类。 接下来,方法名是`getAttributeBoolean`,这表明这个方法用于从解析器中获取一个布尔类型的属性值。参数方面,第一个是null,这可能代表命名空间,通常在Android的XML解析中,如果没有命名空间的话可以传null。第二个参数是xxx,这里应该是指属性名称的字符串,比如"enable"或者某个具体的属性名。第三个参数false是默认值,当属性不存在或无法解析时返回这个默认值。 然后,我需要考虑这个方法的使用场景。通常在自定义View或者处理XML属性的时候,开发者会重写构造函数,并通过AttributeSet来获取XML布局中定义的属性值。例如,在自定义View的构造函数中,使用Context.obtainStyledAttributes来获取属性数组,然后通过类似的方法来提取各个属性的值。 需要注意的是,参数的顺序是否正确。第一个参数是命名空间,第二个是属性名,第三个是默认值。如果命名空间为null,说明这个属性不在任何特定的命名空间下,属于默认的命名空间。例如,在XML中可能这样写:app:enable="true",但如果命名空间是null的话,可能对应的属性名就是不带前缀的。 另外,还要考虑异常处理。如果属性值无法被解析为布尔值,比如用户错误地设置了一个字符串,这时候方法会如何处理?根据Android文档,类似的方法通常会返回默认值,而不会抛出异常,但需要确认具体实现。 可能还需要对比其他类似方法,比如getAttributeInt、getAttributeFloat,它们的结构类似,都是传入命名空间、属性名和默认值。因此,用户可能已经了解过其他方法,现在想知道布尔类型的版本。 最后,应该给出一个具体的例子,说明如何在代码中使用这个方法,让用户更清楚实际应用。例如,在自定义View的构造函数中,通过解析属性集来获取一个布尔值,决定是否启用某个功能。 总结步骤: 1. 确定方法所属的类及作用。 2. 解释各个参数的意义。 3. 说明方法的使用场景和典型例子。 4. 提醒注意事项,如默认值的使用和异常处理。 5. 对比其他类似方法,加强理解。</think>关于 `parser.getAttributeBoolean(null, "xxx", false)` 的解释如下: --- ### 1. **方法作用** 此方法用于 **从 XML 属性解析器中提取布尔值属性**。常见于 Android 开发中解析自定义 View 的 XML 属性。 --- ### 2. **参数说明** - **`null`** 表示 **命名空间**。若属性未定义命名空间(如 `app:xxx` 中的 `app`),则传 `null`。 - **`"xxx"`** 要提取的 **属性名称**,例如 `"enable"` 或 `"visible"`,需与 XML 中定义的属性名一致。 - **`false`** 默认值。当属性不存在或无法解析时,返回此默认值。 --- ### 3. **使用场景** 通常在 **自定义 View 的构造函数** 中解析 XML 属性,例如: ```java public MyView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView); boolean isEnabled = a.getBoolean(R.styleable.MyView_xxx, false); a.recycle(); } ``` --- ### 4. **注意事项** - **返回值逻辑** - 若属性值为 `"true"` 或 `"1"` → 返回 `true` - 若属性值为 `"false"` 或 `"0"` → 返回 `false` - 若属性不存在/格式错误 → 返回默认值(此处为 `false`) - **资源回收** 若通过 `TypedArray` 解析属性,务必调用 `recycle()` 释放资源。 --- ### 5. **对比其他方法** - `getAttributeInt()` → 提取整型属性 - `getAttributeFloat()` → 提取浮点属性 - `getAttributeBoolean()` → 专用于布尔值 --- ### 6. **示例 XML** ```xml <com.example.MyView app:xxx="true" ... /> ``` --- **总结**:`parser.getAttributeBoolean(null, "xxx", false)` 是一个安全提取 XML 布尔属性的工具,通过命名空间、属性名和默认值控制逻辑,适合处理自定义 View 的属性配置。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值