Spring Bootで コンポーネント外からコンポーネントを取得したかった
動機
CDI で言うところの CDI.current().getBeans(...) とか CDI.current().select(...)とかそんな感じのことをやりたかった。
参考リファレンス
ドキュメントでは、やりたいことが書いてあるように見えたのはこのセクション
…Spring Boot 2.1 でテスト時 @Bean を挿げ替えたかった
動機
ユニットテスト実行時に java.time.Clock を特定の時間に固定して再現性のあるテスト(現在の時刻に依存しないテスト)を作成したかった。
考え方/方針
@Configuration で @Bean を定義して Clock をインジェクションできるようにし、実装ではそれを用いる。
text/plain で JSON を投げつけてくるヤツに対処する
の別解。
@Autowired
private RestTemplateBuilder builder;
...
final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_PLAIN));
final RestTemplate restTemplate = builder.additionalMessageConverters(converter).build();
ちなみに上記のようにコンバータを明示的に設定しない場合だと次のような例外になる :
…Java9以降.propertiesファイルをUTF-8で書けるようになった、は正しい?
解答
正しくない。
- Java9(JEP226)で変わったのはリソースバンドルの取り扱い(PropertyResourceBundle) であって プロパティファイル
.properties全般の話ではない。 - プロパティファイル
.propertiesの文字エンコーディングについての取り決めはない。それを取り扱うプログラム次第でありUTF-8を正しく認識してくれるとは限らない。- 標準 API で
UTF-8として(読もうと思えば)読めるようになったのは 1.6 からであって 9 からではない。ちなみに 1.5 以前はISO 8859-1前提。
- 標準 API で
背景
私はうろ覚えで何となく、現在の Java では .properties ファイルを UTF-8 で書ける、ascii2nativeは過去の遺物になった、のだと思いこんでいました。
ところが Spring Boot の application.properties に UTF-8 で日本語を書いたところ文字化けしてしまい、あれ、もしかして自分の理解が間違っているのかと思い調べ直したのがこの記事です。
Testing the Web Layer のコードを JUnit Jupiter にマイグレーションしてみる
概要
(追記: ここで試したのは2.1.4.RELEASE時点のもの。2.2.0.M3以降では #14736の通り JUnit5 がデフォルトになっている模様。)
spring-boot-starter-test の JUnit5 対応はこちらの issue:
…Spring Validator(でラップされたBean Validation)のメッセージをi18nしたときの覚え書き
やりたかったこと
- BeanValidation のプロパティファイル
ValidationMessages.propertiesでなく、 Spring のメッセージプロパティに統合したい。- Spring のメッセージプロパティとは?
Accept-Languageベースでメッセージを国際化したい。
調べた
Spring のメッセージプロパティファイルはどこ?
これはキーワード “site:spring.io i18n message” でググるとすぐ見つかった。
…RPGツクールMVをバージョン管理するための初期設定
他の方が同じ話題で次のエントリを書かれていましたが、gulp 何それ状態なので理解できませんでした。理解できる方はそちらの方が良いのかもしれません。
…Hibernate で CHAR を String にマップする
例えば、生 JDBC でchar型カラムのクエリを書くとString型にマップされます
final Connection connection = DriverManager.getConnection(...);
final Statement statement = connection.createStatement();
final ResultSet resultSet = statement.executeQuery("select char_column from foo_table");
// java.lang.String
resultSet.getMetaData().getColumnClassName(1);
が、Hibernate の Native query を用いて同じように実行するとCharacter型にマップされます:
Eclipseの起動に使用するJDKを指定する(Mac)
最新の JDK をインストールしたが、古いバージョンの Eclipse も利用したい(が最新のバージョンでは起動できない)ような場合に必要となる設定です。
設定するファイルと設定方法
Eclipse.app/Contents/Eclipse にある eclipse.ini に、所望のバージョンの java コマンドが入っているディレクトリを指定します。
/usr/libexec/java_home -V で JAVA_HOME 候補一覧が参照できますので、このディレクトリ + /bin を指定することになります。
Ubuntu18.04 端末の不快なエラー音 消す方法
Ubuntu を 18.04 にアップグレードしたら端末の補完処理で tab キーを押す度にヴヴッという不快なビープ音が鳴るようになってしまった。
端末のメニューから 設定 を選択し設定ダイアログを開く。
ダイアログで自分の使用しているプロファイル(ここではデフォルト)を選択し、文字タブのSoundオプションで端末ベルを鳴らすのチェックを外せば OK。
OpenJDK11をWindowsで自前ビルドする
Java の有償化ってより身近なところでは GPL 化と言った方が現状に即してるな、と思っています。
それはともかく、何となく OpenJDK をデバッグ情報付きでビルドしたくなったのでメモ。
…Azure FunctionsでPowerShell使えなくなっとる
v1 で実験的サポートだった PowerShell が、実行環境のバージョンが上がったとかで v2 になり、選べなくなっているみたい?一時的な話?
実行環境を作る
https://portal.azure.com/ から 「リソースの作成」「Serverless Function App」と選択していきます。
…Invoke-WebRequestやCompress-Archiveを使っていると画面上部に一瞬表示される何かの表示を非表示に
進捗状況(progress)が表示されているそうです。少量のデータを扱っている場合には画面の一部がフラッシュしているように見えており、何のための画面効果かさっぱりわかりませんでした(ので検索キーワードすら思い浮かびませんでした)。
…