5

この問題に関する多くの質問を見てきましたが、決定的な答えはありません。Worklight アダプターの実装から Java クラスを呼び出すのに問題があります。コードを IBM Worklight Java Adapter チュートリアルのコードに置き換えましたが、まったく同じように失敗します。さらに、IBM のサイトで、Java 1.7 コンパイラがこの問題を引き起こしている可能性があり、代わりに Java 1.6 を使用するという回答を見つけました。Eclipse のコンパイラが Java 1.6 であることを確認しました。

Eclipse とコード パスのスクリーンショット

私の Java クラスはすべて com で始まります (例: com.worklight.customcode)。public static メソッドの呼び出し (適切な構文を使用) と、オブジェクトのインスタンス化とメソッドの呼び出しの両方を試みました。前述のとおり、私は Java 1.6 コンパイラを使用していることも確認しました。

いくつかのコード サンプルを次に示します。

アダプター実装ファイル:

function addTwoIntegers(a,b){
    return {
        result: com.worklight.customcode.Calculator1.addTwoIntegers(a,b)
    };
}

Java ファイル (未編集の IBM Worklight サンプル): package com.worklight.customcode;

import java.util.logging.Logger;

public class Calculator1 {

    private final static Logger logger = Logger.getLogger(Calculator1.class.getName());

    public static int addTwoIntegers(int first, int second){
        logger.info("addTwoIntegers invoked");
        return first + second;
    }

    public int subtractTwoIntegers(int first, int second){
        logger.info("subtractTwoIntegers invoked");
        return first - second;
    }

}

コンソールのエラー:

TypeError: オブジェクト [JavaPackage com.worklight.customcode.Calculator1] でプロパティー addTwoIntegers を呼び出せません。関数ではなく、「オブジェクト」です。(%2FUsers%2Fhome%2Fdev%2Fapp%2Fappprj%2Fadapters%2Fadapter/adapter-impl.js#26) FWLSE0101E: 原因: null

関連する質問のいくつかは次のとおりです。

4

5 に答える 5

2

それは CLASSPATH そのものではなく、(どうやら) Eclipse プロジェクトの設定でした。

これを 1 週間以上繰り返した後、.project ファイルを編集して、プロジェクトにない特定の buildCommand タグを含めました。次の buildCommands をセクションに追加すると、Eclipse の再起動後にコードで JavaScript から Java クラスを起動できるようになりました。

<buildSpec>
    <buildCommand>
        <name>org.eclipse.jdt.core.javabuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>org.eclipse.wst.common.project.facet.core.builder</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>com.worklight.studio.plugin.WorklightProjectBuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>org.eclipse.wst.validation.validationbuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
</buildSpec>

.project ファイルは、Worklight プロジェクト ホームのルート (例: myproject/.project) にあります。私は最終的に、JavaScript から Java を正常に呼び出す作業中のプロジェクトに出くわすことで、これを理解しました。

http://www.ibm.com/developerworks/rational/library/server-side-mobile-application-development-1/を参照してください。

コードをそのままプロジェクトにコピーしたところ、コードと同じ動作をしました。コードをそのプロジェクトにコピーすると、コードが機能しました (!!)。次に、多少異なるクラスパスを比較しましたが、動作は変わりませんでした。.project ファイルを調べたところ、ファイルに上記の buildCommand タグがないことに気付きました。代わりに、おそらく私のチームの 1 人が Eclipse 以外の IDE を使用しており、彼の .project がプロジェクト内のものになったため、私のファイルには多数の externalToolBuilding タグが含まれていました。(それが重要であれば、それは崇高だと思います)。

これらのタグのそれぞれが何をするのか、またはそのために Worklight と Eclipse がどのように、なぜその動作を変更するのか (またはそもそもそれらが消えた理由) の詳細を完全には理解していません。しかし、それは私のコードを機能させました。1 週間分の作業しかかかりませんでした (ack!)。

これが将来誰かに役立つことを願っています。

于 2013-05-26T17:31:29.617 に答える
0

上記のすべてのことを試したにもかかわらず、このエラーのためにこの同じ例を機能させることができませんでした。Eclipse 4.4、Worklight 6.2、WebSphere Application Server 8.5.5.1、Java 1.7 を使用しています。アダプターを右クリックし、「Run As」 > 「Invoke Worklight Procedure」を選択してアダプターを実行していました。

最後に、生成された Adapters.war をプロジェクトのビルド パスに明示的に追加することで、機能するようになりました。ビルド パスのプロパティから: JAR を追加... > Adapters/bin/Adapters.war。その時だけ、それは機能し始めました。

于 2014-08-12T06:14:52.343 に答える
0

まず、型変換の問題ではないことを確認してみましょう。Java コードで、次の 2 つのオブジェクト パラメータを使用して Add 関数を定義します。

public static int addTwoIntegers(Object first, Object second) {
    logger.info("addTwoIntegers invoked" + first.getClass() + "," + second.getClass());
    return first + second;
}

サーバー出力を見てください。タイプの問題であった場合、メソッドは機能するはずです。そうでなければ、別の問題があります...

于 2013-05-20T11:27:25.680 に答える