【问题标题】:Error Invoking a Method on a DataSource MBean在 DataSource MBean 上调用方法时出错
【发布时间】:2012-08-06 19:52:50
【问题描述】:

我确定我的做法完全错误,但有人可以指出下面代码中的错误...

MBeanServer server = (MBeanServer) MBeanServerFactory.findMBeanServer (null).get (0);
ObjectName mBean = new ObjectName ("Catalina:type=DataSource,path=/<context>,host=localhost,class=javax.sql.DataSource,name=\"<name>\"");
String [] params = {"<username>", "<password>"};
Connection myConnection = (Connection) server.invoke (mBean, "getConnection", params, null);
Statement myStatement = myConnection.createStatement ();
String myResult = myStatement.executeQuery ("SELECT 1 FROM DUAL;").toString ();
myConnection.close ();

当我尝试通过在我的 MBean 上调用 getConnection 方法来实例化 Connection 对象时,就会出现问题。我收到以下错误...

Aug 6, 2012 8:46:03 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.IllegalArgumentException: Inconsistent arguments and signature
        at org.apache.tomcat.util.modeler.ManagedBean.getInvoke(ManagedBean.java:578)
        at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(Unknown Source)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(Unknown Source)

我做错了什么?

【问题讨论】:

    标签: connection datasource jmx invoke mbeans


    【解决方案1】:

    我看到你在做:

    Connection myConnection = (Connection) server.invoke (mBean, "getConnection",
         params, null);
    

    您正在为我认为不允许的参数签名数组传入null。引用javadocs from MbeanServer.invoke(...)

    @param signature 包含操作签名的数组。将使用与用于加载调用操作的 MBean 相同的类加载器来加载类对象。

    该数组应该包含您尝试调用的方法参数的类名,并且它们必须精确匹配。原始类型应作为字符串"int""long"、...传入,而类类型应作为"java.util.Date""java.lang.String"、...

    所以我认为你需要传递类似的东西:

    String [] params = {"<username>", "<password>"};
    String [] signatures = {"java.lang.String", "java.lang.String"};
    Connection myConnection = (Connection) server.invoke (mBean, "getConnection",
         params, signatures);
    

    【讨论】:

    • 是的,这正是问题所在。非常感谢...我自己永远不会得到这个。我对签名参数的描述是希腊语。
    • 很高兴帮助@Dan。我已经扩展了我的答案,以便更好地定义签名参数。
    • 谢谢你,格雷。我并不是要暗示您给出的解释不清楚;事实上,这很有帮助。鉴于您提供的示例字符串数组“签名”,我能够推测出参数“字符串 [] 签名”应该是什么。我只是想说明 javadoc 的解释有点密集且难以理解。尽管如此,感谢您进一步澄清您的答案。
    • 我想指出,在这个例子中,参数“String[] params”和“String[] signature”都应该为空。 MBean ObjectName虽然表示对象类型为DataSource,但在运行时实际上是BasicDataSource,不支持getConnection(String username, String password)方法。不带任何参数运行它会返回一个有效的连接。
    • 当然可以。我意识到我的回答并没有完全解释给其他人。人们忘记了@Dan,这些答案是给你子孙后代的。
    猜你喜欢
    • 2019-03-16
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多