讨论区 » AAS-V10企业版 »
应用jackson类冲突
分析:客户编写了一个自定义类加载器,加载类的逻辑是 先用SystemClassLoader尝试加载类,如果加载不到则通过上下文类加载器加载 所以客户有一个持有ObjectMapper实例的util类(MapperFactory类),该类通过自定义类加载器加载时自然是用SystemClassLoader加载不到的,所以用的是 上下文类加载器(webappclassloader),当应用的一个代理类(用自定义类加载器加载的)调用这个MapperFactory类时报错( ObjectMapper om= MapperFactory.getInstance().getObjectMapper();//暂时还不会报错 om.writeValueAsString(map);//报错加载ObjectMapper类时出现LinkageError java.lang.LinkageError: loader constraint violation: loader (instance of 客户自定义类加载器) previously initiated loading for a different type with name "com.fasterxml.jackson.databind.ObjectMapper" ) 报错是因为V10用SystemClassLoader尝试加载类是可以加载到ObjectMapper的(modules底下的),而持有ObjectMapper实例的util类的ObjectMapper类是通过上下文类加载器(webappclassloader)加载的,所以虽然ObjectMapper类都是加载同一个jar的,但是类加载器不一样会导致异常 【tomcat没有ObjectMapper所以没问题,所以SystemClassLoader尝试加载类不到的】
解决:设置不让SystemClassLoader加载到ObjectMapper 新增一个类加载器 添加jvm参数设置成系统类加载器,当加载objectMapper类时就抛出异常
具体步骤如下:
1:domain.xml新增jvm参数-Djava.system.class.loader=com.apusic.enterprise.aas.bootstrap.AASSystemClassLoader
2:替换ApusicAS/aas/module/aas.jar
3:重启
具体新增类加载代码如下:
package com.apusic.enterprise.aas.bootstrap;
public class AASSystemClassLoader extends ClassLoader {
public AASSystemClassLoader(ClassLoader parent) {
super(parent);
}
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
if (name.startsWith("com.fasterxml.jackson")) {
throw new ClassNotFoundException("xxxxxx");
} else {
return super.loadClass(name, resolve);
}
}
}
关键字:类冲突 ,jackson,ObjectMapper,