java.lang.UnsupportedOperationException: setXIncludeAware is not supported on this JAXP implementat

环境:jdk1.8.0_291
项目引入了jaxen-1.1-beta-6.jar包
项目启动报了如下的错:

[2021-10-14 11:12:05.382] [ERROR] [main] [Configuration.java:2730]- [Failed to set setXIncludeAware(true) for parser org.apache.xerces.jaxp.DocumentBuilderFactoryImpl@4cbad1d4]
java.lang.UnsupportedOperationException:  setXIncludeAware is not supported on this JAXP implementation or earlier: class org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
	at javax.xml.parsers.DocumentBuilderFactory.setXIncludeAware(DocumentBuilderFactory.java:584)
	at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:2728)
	at org.apache.hadoop.conf.Configuration.loadResources(Configuration.java:2696)
	at org.apache.hadoop.conf.Configuration.getProps(Configuration.java:2579)
	at org.apache.hadoop.conf.Configuration.set(Configuration.java:1257)
	at org.apache.hadoop.conf.Configuration.set(Configuration.java:1229)
	at com.code.common.hdfs.HDFSClient.init(HDFSClient.java:71)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:366)
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:311)
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:134)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
	at com.dragonsoft.cicada.datacenter.DataCenterWebApplication.main(DataCenterWebApplication.java:21)

这个问题主要是:jaxen的包里面DocumentBuilderFactoryImpl没有实现DocumentBuilderFactory的setXIncludeAware这个方法。

细节分析:
org.apache.hadoop.conf.Configuration里面的loadResource方法中,构建DocumentBuilderFactory实例,一步一步跟进去看:
在这里插入图片描述
在这里插入图片描述

static <T> T find(Class<T> type, String fallbackClassName)
        throws FactoryConfigurationError
    {
        final String factoryId = type.getName();
        dPrint("find factoryId =" + factoryId);

        // Use the system property first
        try {
            String systemProp = ss.getSystemProperty(factoryId);
            if (systemProp != null) {
                dPrint("found system property, value=" + systemProp);
                return newInstance(type, systemProp, null, true);
            }
        }
        catch (SecurityException se) {
            if (debug) se.printStackTrace();
        }

        // try to read from $java.home/lib/jaxp.properties
        try {
            if (firstTime) {
                synchronized (cacheProps) {
                    if (firstTime) {
                        String configFile = ss.getSystemProperty("java.home") + File.separator +
                            "lib" + File.separator + "jaxp.properties";
                        File f = new File(configFile);
                        firstTime = false;
                        if (ss.doesFileExist(f)) {
                            dPrint("Read properties file "+f);
                            cacheProps.load(ss.getFileInputStream(f));
                        }
                    }
                }
            }
            final String factoryClassName = cacheProps.getProperty(factoryId);

            if (factoryClassName != null) {
                dPrint("found in $java.home/jaxp.properties, value=" + factoryClassName);
                return newInstance(type, factoryClassName, null, true);
            }
        }
        catch (Exception ex) {
            if (debug) ex.printStackTrace();
        }

        // Try Jar Service Provider Mechanism
        T provider = findServiceProvider(type);
        if (provider != null) {
            return provider;
        }
        if (fallbackClassName == null) {
            throw new FactoryConfigurationError(
                "Provider for " + factoryId + " cannot be found");
        }

        dPrint("loaded from fallback value: " + fallbackClassName);
        return newInstance(type, fallbackClassName, null, true);
    }

这个方法,先会去从系统属性中获取资源名称,如果没有则尝试从$java.home/lib/jaxp.properties文件读取资源,如果还没有则通过应用类加载器找到类实例。因为我的系统属性没有这个资源名称,也没有jaxp.properties这个配置文件,所以会通过应用类加载器加载jaxen包下的类实例,DocumentBuilderFactory的setXIncludeAware这个方法,所以报了这个错。

解决方法:

方法一:(不建议)

在你使用的jdk安装路径下的/jre/lib下面

如果存在jaxp.properties则将其中内容改为下面的配置就可以了javax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
javax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

如果不存在javafx.properties,创建文件,把内容复制粘贴进去,添加到/jre/lib下面

方法二:
创建一个包名路径与xercesImpl-2.6.2.jar里面DocumentBuilderFactoryImpl相同的类,然后在这个类里面实现setXIncludeAware的方法,然后重编译之后,将这个新类的class文件替换到xercesImpl-2.6.2.jar 里面。

### java.lang.UnsupportedOperationException: getSubject is not supported 的解决方案 `java.lang.UnsupportedOperationException` 是 Java 中的一种运行时异常,当程序试图执行某个对象不支持的操作时会抛出此异常。对于 `getSubject is not supported` 这一具体场景,通常是由于某些类或接口的实现并未定义该方法的行为所致。 #### 可能的原因分析 1. **未完全实现的接口** 如果使用的类实现了某接口但未重写其部分方法,则调用这些未实现的方法时可能会触发此类异常[^1]。 2. **不可变集合操作** 当尝试修改一个不可变集合(如通过 `Collections.unmodifiableCollection()` 创建的对象),或者使用了只读视图的集合时,也可能引发类似的错误[^2]。 3. **第三方库限制** 特定于 Redis 集群环境下的流水线功能被禁用的例子表明,在特定框架或工具中可能存在对某些特性的显式约束[^3]。同样地,“getSubject” 方法可能受限于所依赖的安全管理器或其他上下文配置。 4. **数据结构特性冲突** 类似于列表添加失败案例中的描述,如果目标容器本身不允许动态扩展或者其他形式的数据变更行为,也会造成同样的问题表现[^4]。 #### 解决方案建议 以下是针对上述情况提出的几种通用处理办法: - #### 检查并确认实际需求与现有API匹配度 开发者应仔细阅读官方文档了解哪些组件确实提供了所需的功能以及它们各自的适用范围。例如验证是否存在替代版本可以满足获取主体的需求而不会触犯系统规则。 - #### 自定义覆盖默认行为 若允许的话,可以通过继承原有基类来重新定义那些必要的成员函数从而避免原生局限带来的困扰。比如创建一个新的子类别专门用于适配特殊用途场合下缺少的标准服务项目。 ```java public class CustomSecurityManager extends SecurityManager { @Override public String getSubject(){ return "Custom Subject Implementation"; } } ``` - #### 替代策略寻找其他途径达成目的 考虑是否有别的技术路线能够绕过当前障碍完成既定任务。比如说改变设计模式减少对外部资源直接访问频率;或者是选用更加灵活适应性强的新一代产品替换掉旧版存在缺陷的部分模块等等措施都是可行的选择之一。 - #### 更新至最新稳定发行版 很多时候老式的遗留代码里头隐藏着不少历史包袱难以根除干净,因此适时升级到最新的软件包往往有助于消除潜在隐患同时享受更多现代化改进成果所带来的便利之处。 --- ### 注意事项 尽管以上列举了几种常见的应对方式供参考借鉴,但在实施过程中仍需注意具体情况具体对待原则,切勿盲目照搬硬套以免引起新的矛盾纠纷甚至更严重的后果发生。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值