0

我确定我会以完全错误的方式解决这个问题,但有人可以指出下面代码中的错误......

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)

我究竟做错了什么?

4

1 回答 1

2

我看到你在做:

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

您正在传入null我认为不允许的参数签名数组。引用javadocs 来自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);
于 2012-08-06T20:14:44.350 回答