intra-martでJavaScriptのオブジェクトをJavaに受け渡す

2019年12月26日 00時12分

結論

今回は JSON に変換して渡しました。

JavaScript 側はJSON.stringify で文字列に。Java 側は jackson を使用しました。

日時については、JSON.stringify は ISO 8601 準拠なので、パーサーにはそれを教えてあげてください。

ECMAScript defines a string interchange format for date-times based upon a simplification of the ISO 8601 calendar date extended format. The format is as follows: YYYY-MM-DDTHH:mm:ss.sssZ

https://stackoverflow.com/questions/36252556/jackson-deserialize-iso8601-fromatted-date-time-into-java8-instant

intra-mart とは

intra-mart は、NTT データが開発しているシステム共通基盤です。

アプリケーションから GUI でワークフローを設計できたり、Java や JavaScript でビジネスロジック自体を設計することができます。

img concept 01

NTTDATA intra-mart とは?

開発でバックエンド側の開発は JavaScript ベースのもの(通称スクリプト開発)と JavaEE のものがあり、サクッと作れるスクリプト開発、しっかりつくる JavaEE と分けてます。

バックエンド開発する上で、スクリプト開発ではどうしても要求を満たせない場合(JavaScript ES5 相当?、型等)はどうしても不安な場合は JavaEE で開発したりするパターンがあります。

intra-mart 自体も JavaEE 基盤で動いている下図参照(スクリプト開発のコードはコンパイルされる)のでサードパーティーのプラグインを導入する際も、そちらの方が好ましいです。

参考 intra-mart のアプリケーション開発概要

JavaScriptとJavaが共存する開発…

となってくると、スクリプト開発の実装の際に、Java オブジェクトを呼び出す機能までは存在しているので、開発者はどっちにでも対応できるように書いておいた方が安心感が出てくる。(統一できるならそれに越したことはないんですけど。

問題は、Java ベースのインスタンス生成後にメソッドを実行するための型をどう整合性をとっていくかということになる。

まず、暗黙の型変換を期待したかった。簡単なテストプログラムなら動いたので…。

古い内容ですが、やっぱり JavaScript のプリミティブ型しか暗黙の変換してくれないかーという感じです。

コンストラクタまたはメソッドが引数を必要とする場合、JavaScript から直接受け取る事のできる変数型は String, byte, int, long, short, float, double, および boolean のみとなります。

また、メソッドが返却値を持つ場合で、その返却値を JavaScript でそのまま利用する場合は、String, byte, int, long, short, float, double, boolean のみを利用するようにしてください(NaN を返却する場合 Double.NaN を返却する事で、JavaScript)。

自作クラスの呼び出し方

ということなので、Java 側の変数はできるだけ JavaScript ベースで整えてあげた方がいい(1 敗)。変換用の関数を置いておいたり、できるだけ Java 側に合わせられるように。

今回は配列をどうしても渡す必要があったので、

1.JSON に変換して、JavaEE 側でオブジェクトにパースする

2.スクリプト開発から JavaEE に移行する

のうちの、1を選びました。

ここまでくれば実装は

package myclass;

import java.io.IOException;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

//Java側
public class Hoge {

   public void printArray(String JsonString) throws IOException{
        ObjectMapper mapper = new ObjectMapper();
        List<String> list = mapper.readValue(JsonString, new TypeReference<List<String>>() {});
        //ここに何らかの処理を書く
        System.out.println(list);
     }
}
//JavaScript側
var array = [

“foo”, “bar”

]
var obj = new Packages.myclass.Hoge();

Debug.browse(obj.printArray(JSON.stringify(array));

でいい感じに出力されました。

型はきっちりかっちりやっておきたいのですが、勉強になりました。

今回は jackson の実装例は下記の実装例を参考にさせていただいています。ありがとうございます。

参考 https://qiita.com/opengl-8080/items/b613b9b3bc5d796c840c

宣伝

1 月 25 日(土)10:20-12:00 に第 10 回福山 IT 座談会を開催します。

今回は普段と違い地域のコミュニティスペース予定地をお借りしての実施になります。リモート参加でも大丈夫なように準備をしています。

よろしくお願いいたします。