我怀疑这里发生的事情是您的 servlet 线程具有与您正在调用的 MBean 不同的上下文类加载器。因此,如果 MBean 属性、操作参数或返回值包含的类型不是核心 JVM 类(或未从同一个根类加载器共享的类),您将获得 ClassCast、ClassNotFound 和 ClassDefNotFound 异常。
此过程可能对您有用。您需要做的是临时将 servlet 线程的上下文类加载器更改为与加载 MBean 相同的类加载器。调用完成后,您再次将其设置回来。由于您知道目标 MBean 的 ObjectName,因此 MBeanServer 将为您提供正确的类加载器。
这是一个基本示例:
public void callMBean() throws MalformedObjectNameException, NullPointerException, InstanceNotFoundException {
final ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
try {
ObjectName targetObjectName = new ObjectName(".....");
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ClassLoader tmpClassLoader = server.getClassLoaderFor(targetObjectName);
Thread.currentThread().setContextClassLoader(tmpClassLoader);
// ==========================================
// Invoke operations here
// ==========================================
} finally {
Thread.currentThread().setContextClassLoader(currentClassLoader);
}
}