[Seasar-user:19155] [S2JDBC] Unicodeマッピングの違いを吸収する方法について

Hiroshi Ogawa [E-MAIL ADDRESS DELETED]
2010年 1月 19日 (火) 23:41:54 JST


小川と申します。
S2JDBCで首題の内容を行う方法について質問させてください。

[環境]
Seasar 2.4.40
SAStruts
S2JDBC
Tomcat 6.0.18
Java 1.6.0_16
Postgres 8.3.7
Postgres JDBC 8.3-604 Type4

データベースの文字コード, Java/JSPの文字コードをUTF-8としています。
今回開発しているシステムのクライアントはWindowsのため、
画面から入力された文字列は CP932系の Unicode として
サーバへ送信され、現在はそのままデータベースへ格納しています。

今回開発しているWebシステムにおいては問題ないのですが、
このデータベースは他システムからも参照されます。
その他システムはデータベースに格納されている文字が
Shift_JIS 系の Unicode であることを期待しています。
そのため、例えば画面から入力された値に'〜'等の文字が含まれていると、
他システムで正しく表示できないという問題が発生しています。

他システムは変更できないため、今回開発しているシステムで
Unicodeマッピングが異なる文字を 格納(insert, update)時に
Shift_JIS系の Unicodeに置換し、取得(select)時にその逆の置換を
行うことを考えています。
アプリ側で対応を行うのは非常に大変なので、フレームワーク側で
吸収したいと思っています。

SeasarのMLを検索したところ、以下のスレッドが見つかりました。
http://ml.seasar.org/archives/seasar-user/2004-June/000797.html

このスレッドでは SELECT時に Map(List)ResultSetHandler を使っていると
上手くいかない(static なValueTypeを直接返す)とありますが、
Seasar 2.4.40のソースを見ると、登録した ValueType を
返しているように見えました。

そのため、以下の方法でよいのではないかと考えています。

1. org.seasar.extension.jdbc.types.StringTypeを継承した
  クラス(CustomStringType)を作成し、getValue(), bindValue() をオーバーライドして
  置換処理を加える

2. システム起動時に以下のように登録する(HOT DEPLOYでは問題あり・・?)
  ValueTypes.registerValueType(String.class, new CustomStringType());

ただ、かなり前の内容みたいですので、今のS2JDBCでも
この方法で大丈夫なのかがわかりません。
この方法で大丈夫か、又はもっといい別の方法がある・・といったことを
教えていただけないでしょうか。

S2JDBCでは SQL自動生成と外部SQLファイルの2種類をつかっています。
SELECT結果はEntityで受ける場合と、BeanMap で受ける場合の
2種類あります。

ソース・コード内に対象文字をハードコーディングしていたり、
ローカルファイルからデータを取得することもあるので、
サーブレット・フィルタはNGだと思っています。

よろしくお願いします。


Seasar-user メーリングリストの案内