背景
最近仕事でWebSphere Liberty (Open Liberty)を利用する事になりましたが、JPAでデータベースの項目を取得するときに標準ではCHAR型のスペースが自動トリムされていることが判明しました。CHAR(3)の項目に、"a "(後ろにスペース2つ)や" "(スペース3つ)を意図的に設定しているときに、"a"や""(空文字列)と取得されてしまいます。調べると、これはEclispeLinkの標準仕様だそうで。
#Solution
persistence.xmlかなにかの設定で簡単に変更できると思いきや単純な設定はなさそうでした。はまってしまいましたが、その解決方法としてはSessionCustomizerを作成する必要がありました。
###SessionCustomizerの作成
JavaEE APIでの対応が難しく、EclipseLinkのAPIを利用した制御が必要です。
import org.eclipse.persistence.config.SessionCustomizer;
import org.eclipse.persistence.sessions.Session;
public class YOURSessionCustomizer implements SessionCustomizer{
public void customize(Session session) {
session.getLogin().setShouldTrimStrings(false);
}
}
###persistence.xmlの設定
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<!-- 中略 -->
<persistence-unit name="ABC" transaction-type="JTA">
<!-- 中略 -->
<properties>
<!-- EclipseLink settings -->
<property name="eclipselink.validate-existence" value="true"/>
<property name="eclipselink.logging.level" value="ALL" />
<property name="eclipselink.logging.sql" value="ALL"/>
<property name="eclipselink.logging.level.sql" value="ALL"/>
<property name="eclipselink.logging.parameters" value="true"/>
<!-- 追加したところ -->
<property name="eclipselink.session.customizer" value="package.YOURSessionCustomizer"/>
<!-- 追加したところ -->
</properties>
</persistence-unit>
</persistence>
###Libertyのserver.xmlの設定変更
<server>
<!-- 中略 -->
<webApplication contextRoot="app" id="webapp" location="webapp.war" name="webapp">
<classloader apiTypeVisibility="spec, ibm-api, stable, third-party" />
</webApplication>
</server>
参考:Java EE アプリケーションからのサード・パーティー API へのアクセス
https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/twlp_classloader_3p_apis.html
###(option)pox.xmlの修正
EclipseLinkのAPIのが必要ですので、プロジェクトのクラスパスの通し方に応じて設定してください。
EclopseLinkはLibertyに含まれますのでprovided
にしてます。
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.6.9</version>
<scope>provided</scope>
</dependency>