1

Java ライブラリを呼び出す小さな Groovy スクリプトを使用しています。Java ライブラリにはメソッドm(String,int)があり、2 番目のパラメーターは int プリミティブ型です。

以下のスクリプトは、新しい int 変数を作成し、メソッドの呼び出しを試みます。

int year = 2013
def obj = dao.m("johndoe", year)

java.lang.Integerしかし、2 番目の引数の型がプリミティブ int ではなくラッパーで あるため、失敗します。groovy.lang.MissingMethodException: No signature of method: com.sun.proxy.$Proxy11.m() is applicable for argument types: (java.lang.String, java.lang.Integer) values: [IN-94158-11, 2013]

メソッド m() を呼び出せるように、プリミティブ int を保持する変数を宣言するにはどうすればよいですか?

この問題に悩まされている人もいます。Groovy Users のこのメールから:

As we stated earlier, it doesn’t matter whether you declare or cast a variable to be
of type int or Integer. Groovy uses the reference type (Integer) either way.
4

2 に答える 2

0

解決しました。

問題は、JNDI ルックアップの結果がまだリモート オブジェクトではなく、リモート オブジェクトへのプロキシをインスタンス化する EJBHome オブジェクトであったことです。

そのため、メソッド lookup の呼び出しの結果にはメソッド m() がありません。代わりに、remove()create()getEJBObject()getEJBMetadata()およびその他のメソッドがあります。

したがって、私のスクリプトは次のようになります。

// def dao = ctx.lookup("MyDao")       // WRONG ! Result of JNDI lookup returns an EJBHome,
                                       //   not a proxy to the remote object
def dao = ctx.lookup("MyDao").create() // OK. This is a proxy to the remote object.
dao.m("johndoe", 2013)                 // OK. Groovy DOES call the correct method,
                                       //   which takes an int.

オブジェクトのクラスとそのメソッドを以前に確認する必要がありました。

dao.class
dao.class.methods
于 2013-06-13T17:46:14.253 に答える
0

Groovy 2.1.3、JDK 7 では次のように再現できませんでした:

// file EjbImpl.java
import java.lang.reflect.*;

public class EjbImpl {
  private EjbImpl() {}
  public Ejb newInstance() {
    return (Ejb) Proxy.newProxyInstance(
        EjbImpl.class.getClassLoader(),
        new Class[] { Ejb.class },
        new InvocationHandler() {
          public Object invoke(Object proxy, Method method, Object[] args) {
            System.out.println("invoke " + method);
            return args.toString();
          }
        }
      );
  }

  public void process(int i) {
    System.out.println("ejb.process = " + i);
  }
}


// Ejb.java
public interface Ejb {
  public void process(int i);
}


// EjbTest.groovy
ejb = EjbImpl.newInstance()
ejb.process new Integer(90)

それがEJBがプロキシを作成する方法であるかどうかはわかりません...

試しましたyear.intValue()か?

于 2013-06-13T16:39:02.670 に答える