【发布时间】:2011-03-02 07:09:53
【问题描述】:
好的,所以。我已经部署了一个通过 spring 的 MBeanExporter 和注释公开的 MBean 的战争。我部署了另一个战争应用程序,它使用一些代码与 mbean 对话。我在从该客户端代码调用 mbean 上的函数时遇到问题。
在尝试调用操作 getPermissions 时,RequiredModelMBean 中发生了 RuntimeException。
mbean 方法的签名是 Collection getPermissions(GrantedAuthority role)。
我用来调用它的代码是
Object[] params = {role}; //role is passed in as a GrantedAuthorityImpl (implements GrantedAuthority)
String[] signature = {"org.springframework.security.core.authority.GrantedAuthority"};
mbeanServer.invoke(new ObjectName(mbeanName), "getPermissions", params, signature);
可能是什么问题,或者我应该看什么?
javax.management.RuntimeOperationsException: RuntimeException occurred in RequiredModelMBean while trying to invoke operation getPermissions
javax.management.modelmbean.RequiredModelMBean.invokeMethod(RequiredModelMBean.java:1080)
javax.management.modelmbean.RequiredModelMBean.invoke(RequiredModelMBean.java:955)
org.springframework.jmx.export.SpringModelMBean.invoke(SpringModelMBean.java:90)
org.jboss.mx.server.RawDynamicInvoker.invoke(RawDynamicInvoker.java:164)
org.jboss.mx.modelmbean.RequiredModelMBeanInvoker.invoke(RequiredModelMBeanInvoker.java:127)
org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
xxx.MBeanPermissionMapLookup.getPermissions(MBeanPermissionMapLookup.java:31)
xxx.MBeanPermissionMapLookup$$FastClassByCGLIB$$667f3fad.invoke(<generated>) ...
root cause: java.lang.IllegalArgumentException: argument type mismatch
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
sun.reflect.misc.Trampoline.invoke(MethodUtil.java:37)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:244)
javax.management.modelmbean.RequiredModelMBean.invokeMethod(RequiredModelMBean.java:1074)
javax.management.modelmbean.RequiredModelMBean.invoke(RequiredModelMBean.java:955)
org.springframework.jmx.export.SpringModelMBean.invoke(SpringModelMBean.java:90)
org.jboss.mx.server.RawDynamicInvoker.invoke(RawDynamicInvoker.java:164)
org.jboss.mx.modelmbean.RequiredModelMBeanInvoker.invoke(RequiredModelMBeanInvoker.java:127)
org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
xxx.MBeanPermissionMapLookup.getPermissions(MBeanPermissionMapLookup.java:31)
使用 Spring 3.0.4、Spring security 3.0.3、jboss 5.1.0、java jdk 1.6.0-17。
【问题讨论】:
-
RuntimeException 并没有告诉你太多,不是吗! ;)。你能设置一个调试点吗?
-
是的,如果我把两边的参数都改成字符串,它成功调用方法并返回就好了,我认为它与特定的spring安全类有关,所以我有玩过这个,但到目前为止没有运气。
-
在黑暗中拍摄(因为我不确定 Spring 是如何处理这个问题的,您也没有在代码中显示它),但是
role定义为GrantedAuthority或GrantedAuthorityImpl? Spring 可能检查得不够深入,无法判断它们是可互换的。 -
是的,我已经考虑过了,但我会再试一次......我也尝试将它作为 GrantedAuthorityImpl 传递并在 mbean 上创建一个新方法来处理它。我只是想知道我是否在概念上遗漏了一些东西来完成这项工作?也许是类加载器问题?
-
类加载器问题会给您一个 NoDefFound 或 ClassNotFound 异常,除非在您的路径中的其他位置定义了另一个
.org.springframework.security.core.authority.GrantedAuthority或org.springframework.security.core.authority.GrantedAuthorityImpl没有相同的签名。
标签: java spring jboss spring-security jmx