Webixでイベントを実装する

 今作っているWebのUIに、前回使ったw2uiをまた使おうかと思いましたが、今回対象のUIが他のWebサイトから遷移する前提なので、w2uiでは遷移元のWebサイト画面との違和感が強く、別のJavascriptUIフレームワークを探してみたら、Webixを発見。
 
 すっきりした見た目で違和感なさそうなので、今回はWebixを使ってみることにします。
 
 こちらのサイトに概要が書かれているのでとても参考になりました。

 で、UIの形は出来てきたので、イベントの実装をどうやるのかとドキュメントを見ていくと、ボタンのようなUI Controlでは、下記のようにidを指定してイベントを実装するようです。

ドキュメントが充実しているので、とても助かります。

SpringBoot ファイルアップロードでエラーが出る

 前にSpringBootで作ったWebアプリで、たまにファイルアップロードエラーが出ているとの事でログを確認。

 こんなログが吐かれています。

2020-08-03 16:31:28.826 ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/xx].[dispatcherServlet] Servlet.service() for servlet [dispatcherServlet] in context with path [/xx] threw exception [Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1401623156062740234.8080/work/Tomcat/xx/xx] is not valid] with root cause
java.io.IOException: The temporary upload location [/tmp/tomcat.1401623156062740234.8080/work/Tomcat/xx/xx] is not valid

 同事象のコチラを参考にテンポラリの場所を変えてみたのですが、開発端末のWindowsだと、どうも設定した値はデフォルトのテンポラリディレクトリの中に指定したディレクトリに出力しようとしてやっぱりエラーになるような感じでした。

 で、次にコチラを参考にspring.http.multipart.locationとして設定したところ、エラーは解消したようなのですが、非推奨になっています。。

 最後に実行環境のEC2にデプロイしたところ、spring.servlet.multipart.locationで指定してちゃんと動きました。アップロード後にtmpファイルは自動的に浄化されています。

 OSで違うなんて微妙な感じです。。

「Twilio」で電話をかけてみた

自動で電話をかけたいな。
という話で、Twilioをトライアルしてみました。
要件としては架電して相手に日本語で要件を連絡、通話できたかを判定して・・・というところです。

Twilioにアカウントを作成し、ダッシュボードで電話番号を取得します。
DOCを参照しながら、とりあえず試すだけなので、Javaで適当に書いていきます。
基本的なところは、下記を参考にさせて頂きました。

SMSの発信や電話をかけるところまでは特に問題ありませんでしたが、上記サイトの内容とは現時点で変わっているのか、なかなか日本語を喋ってくれません。
あと、トライアル着信の「アカウントをアップグレードしてね」文句の後に何か押さなくてはいけないというのも暫くして気が付きました。。

どうしたら日本語を喋ってくれるのかと、ドキュメントを見ながらaliceとかを試してみたりしましたが、何かゴニョゴニョ言ってるけど何を言っているのか不明。。
結果的にダッシュボード左メニューのサービス→Programmable Voice→TwiML→テキスト音声変換のText-to-Speechという所に日本語はMizukiだと書いてあったので、やってみるとやっと喋ってくれました。ありがとうMizukiさん。

あと、TwiMLをインターネット上のURLからPOSTで取得できるようにしておく、という謎の制約もかなり厄介だったのですが、こちらも結果的に下記のようにすると必須では無かったようです。

とりあえず要件は満たせそうです。
通話判定はもっとケースが必要ですし、判定待ちをもっとましな形にしたいところですが、トライアルなのでここまで。

ランニングコストがOKになって実際に導入すると決まったら、もうちょっと調べないとですね。

カテゴリー: Java

Windows環境からLinux環境にしたらJavaプロセスが動かない

 Windows上で動作させていた既存システムの開発環境を、今回Dockerで動かす形に変えていました。
既存システムの構成上、javaプロセスを2つ立ち上げる必要があり、これまでwindows上でバッチファイルで実行していたのを適当にシェルに置き換えて実行してみましたが、下記のようなメッセージが出てプロセスが動作しません。


See http://www.oracle.com/technetwork/java/javase/documentation/index.html for more details.
/var/lib/apl/tools/lib/app-XXX-server.jar: line 1: $'PK¥003¥004': command not found
/var/lib/apl/tools/lib/app-XXX-server.jar: line 2: $'¥373^¥226P': command not found
/var/lib/apl/tools/lib/app-XXX--server.jar: line 3: ??e?y: command not found
/var/lib/apl/tools/lib/app-XXX--server.jar: line 4: syntax error near unexpected token )'
/var/lib/apl/tools/lib/app-XXX--server.jar: line 4:
?z?z?M)?^)? {,? ?MLy?x?P]?p?PK'

 なんじゃこりゃ?

JAVA実行コマンドとしては、
java -cp resource;lib/* jp.co.esoro.app-XXX.main
のような感じです。

 暫く試行錯誤していましたが、結果的にクラスパスを複数指定するところのセパレータ「;」はWindowsだけで、Linux環境では「:」じゃないとだめというオチでした。。

カテゴリー: Java

Springboot Securityのログイン画面がいい感じになっていた

 Springbootで作ったアプリを、そろそろユーザーに渡そうかというタイミングになりましたが、Springbootのバージョンが結構更新されているので、今更ながら最新に入れ替えてみました。
 それまでフレームワークは、spring-boot-starter-parentの2.0.1.RELEASEを指定していましたが、今見ると2.1系の次に2.2系が既に出ています。
 コードに影響があれば、そこまで最新にしなくてもいいかととりあえず2.2.4を試したところ、特に問題が無かったのでチェンジ。
 今回のアプリはsecurityのデフォルトログイン画面を使っていたのですが、更新したところ画面が変わりました。どうやら2.1から既に変わっていたようです。

2.0系はこれ

2.1系overはこれ

2.0系の見ためがしょぼいのでカスタマイズしようか考えましたが、中央寄せのいい感じのUIに変わってました。これならそのままでも違和感無いですね。

アプリの動作確認は終了、最後に、バージョンアップでこんな警告が出るようになったみたいなので、
2020-02-27 14:09:12 WARN JpaBaseConfiguration$JpaWebConfiguration spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning

出ないようにapplication.ymlに追加

受け渡し準備OKです。
でもjarのファイルサイズはどんどん肥大化してます。。

Mavenインストールが失敗するようになった

SpiringBootで作成中のツールにちょっと機能が漏れていたので、pom.xmlにライブラリを追加したところ、ダウンロード出来ませんとの事。

mavenリポジトリから501が応答されているのですが、何か変わったのでしょうか?
試しに、ブラウザ越しに上記のDownload URLをたたくと下記の応答

501 HTTPS Required.
Use https://repo.maven.apache.org/maven2/
More information at https://links.sonatype.com/central/501-https-required

httpsにしなくちゃいけないって事?

ちょっと調べると下記を発見。

今時当たり前なのですが、Mavenリポジトリがhttpsのみに変わったようです。

Mavenツールが古いからかな?とまずeclipse(marsを今でも使用中)から更新の確認を実行してもダメ。
インストールの詳細からm2e Eclipse用Maven統合 を更新してもダメでした。

上記リンクに、pom.xmlで設定するのは例が書かれていますので、有難くこれで一旦解決には出来ますが、プロジェクト個別設定でなくて全体的にどうにかならないの?と、.m2に置いてあるsetting.xmlの設定で対応してみます。

結果、リポジトリ設定ではうまくいかず、ミラーの設定をしてみると、ちゃんとライブラリをダウンロードしてくれるようになりましたが、
初回はミラーから全てのライブラリをダウンロードしようとするようなので、とりあえずはpom.xmlで個別に対応した方がいいかもしれません。

後日、別環境で使っているeclipseで確認したところ、比較的新しいeclipseでは特に問題が無かったようです。どうやら、古いバージョンのeclipseだけ対応出来ないようです。

カテゴリー: Java

w2uiでテーブルメンテナンス画面を作ってみる

SpringBootで作っているアプリに、テーブルメンテナンス画面が必要になったので、w2uiで作ってみる事にしました。


テーブルメンテナンス画面といえば、一覧表示があって、選択したら登録フォームが表示されて、とか基本的な構成はどのテーブルも似たようなものですよね。w2uiのグリッドとフォームを使い、使いまわし出来るようjavascriptに機能を纏め、html側にテーブル固有の個別設定を寄せる事で、いろんなテーブルに対応出来るような形にしていきます。
w2uiのformは、urlを指定するとthis.save()でフォームをPOSTしてくれるようなのですが、ちょっと扱いにくいのでsaveを使わずにjsonでPOSTするようにしました。

eclipse上のリソース構成はこんな感じです。

javascriptです。ちょっと変更後のUIの動きがアバウトではありますが。。

htmlにはjsで定義済の要素とか変数を載せます。メンテ対象のテーブルが増えた場合を考慮しツールバーも入れてます。なお、項目の設定はw2uiのドキュメントを見ながら調整していきますが、結構融通が利きますね。

最後にというか、本来なら最初にですがSpringBoot側は、w2uiの項目名と一致するエンティティクラス(ここではCustomer)と、CrudRepositoryを継承したインターフェースCustomerRepositoryを用意し、RESTコントローラーからアクセスさせるようにします。

で、出来た画面です。

なお、今回セキュリティ要件は考慮していません。。

msg形式のメールファイルをemlファイルに変換する

 数年前にjavamailで作ったメールを受信した後の業務を自動化するツールを、今でもいろいろ機能追加をしているのですが、機能を追加・変更する時に、利用者から対象のメールをemlで提供してもらってテストしています。
 でも、outlookユーザーはmsgでしか提供出来ませんというので、emlへ変換したいのですが、ネットに転がってるツールを使ってもイマイチ変換できません。。
 なら作ろうと調べた所、javaならjotlmsgというのがあったのですが、日本語が文字化けします。
 結局、apache poiでoutlookのmsgを扱えるようなので、msgファイルを読み込んでemlファイルへ出力するという形にしました。

 実行時の引数を、msgファイルを入れたパス、emlファイルを吐き出すパスで指定します。

 何件かのmsgファイルを試した所、htmlで取れるケースが無かった。。メソッド的にはあるはずなのに。。
 その為、完全にemlファイルで再現出来るというレベルにはなりませんでしたが、本文テキストと添付ファイルはemlファイルに出力できているので、まあここまででよいかと。

カテゴリー: Java

Mybatis自動生成SQLからスキーマ名を除外

 既存のWebサービスをマイグレーションしようという事で、Springboot&Mybatis3で実装を開始し、開発端末上のOracleDBに接続してMybatisの自動生成機能を使用してみました。

 かなり便利で、簡単なSQLで済む範囲ならSQLを書く必要が無いようです。が、自動生成されたxmlを見てみると、SQL内のテーブル名にスキーマ名が付加されてしまいます。。
 実際に使用するサーバ上のDBはどんなスキーマ名になるか現段階では解らないし、スキーマ名をカットしてくれる設定が無いか、下記を読み込みます。

http://www.mybatis.org/generator/configreference/table.html

それっぽいのを何個か試して、結果、ignoreQualifiersAtRuntime をつける事でsqlMap.xmlに自動生成されるSQLからスキーマ名が無くなりました。

でも、既存システムはかなり複雑なSQLが多数有り、DB設計はそのままとなると、自動生成の恩恵も一部の限られた範囲になってしまいます。

カテゴリー: Java

springboot AOP でリクエストパラメータをログに出力する

かなり前から稼働しているWebサービスをspringbootで再構築をしているところですが、リクエストとレスポンスをログに出力するという既存仕様の踏襲にAOPを使ってみました。
 対象のWebサービスは、昔ながらのフォームのポストでリクエストを受け付ける仕様なので、application/x-www-form-urlencodedに対応する形になります。
AOPについては、こちらを参考にさせて頂きました。
リクエストとレスポンスなので、@Aroundでメソッドの前後にログ出力をします。

Controllerのメソッド引数にHttpServletRequestとHttpServletResponseを入れる事で、Advicer側でパラメータが取得出来ました。

Adviser側です。

下記のようにログに出力されました。
2019-05-21 11-38-39.002:0:0:0:0:0:0:0:1:/online/XXXX.do:Id=9999999&Password=ggggg&Action=regist

 でも、今回の要件にはこれ以外にログ出力要件があり、Controllerの引数ではちょっと無理っぽい。。
 他にも、同じクラスから呼ばれたメソッドには適用されないようなので、ビジネスロジック側の影響は避けられないようでした。
 また、戻りがあるメソッドに適用するにはjoinPoint.proceed()の戻りを返す必要があったりと、色々ハマりどころがあるようです。