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あなたは私が許可されていないと思うparam署名配列を渡しています。からjavadocsMbeanServer.invoke(...)を引用するには:

@paramsignature操作のシグニチャを含む配列。クラスオブジェクトは、操作が呼び出された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 に答える