2010-11-05 121 views
1

好的,如此。我已經通過Spring的MBeanExporter和註解部署了一個展示MBean的戰爭。我還部署了一個使用一些代碼與mbean交談的戰爭應用程序。我有一個問題,從客戶端代碼調用mbean的函數。mbeanServer.invoke中的參數類型不匹配

嘗試調用操作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。

+0

RuntimeException不會告訴你很多,典型的不是它! )。你能設置一個調試點嗎? – 2010-11-05 16:14:39

+0

是的,如果我將兩邊的參數更改爲字符串,它會成功調用該方法並返回正常,我認爲它與特定的彈簧安全類有關,所以我已經玩過了,但沒有運氣至今。 – gtrak 2010-11-05 16:20:53

+0

在黑暗中拍攝(因爲我不確定Spring如何處理這個問題,也沒有在你的代碼中顯示它),但是將'role'定義爲'GrantedAuthority'或'GrantedAuthorityImpl'? Spring可能沒有足夠深入地檢查它們是否可以互換。 – Benn 2010-11-05 16:36:05

回答

0

有問題的類不能跨越類加載器邊界,因爲類加載器內部是jboss中類型的一部分,所以它是參數類型不匹配。