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

結論

今回は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でビジネスロジック自体を設計することができます。

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座談会を開催します。

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

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

シェアする

  • このエントリーをはてなブックマークに追加

フォローする