gwt な slim3 の Validators で悩む
gwt な slim3 では ServiceImpl に Validators を仕込むしかないので、Entity の更新用メソッドに下記のような一連の記述を追記した。
public void update(String name) { final Map<String, Object> params = new HashMap<String, Object>(); params.put("name", name); final Validators v = new Validators(params); v.add("name", v.required()); if (v.validate()) { (snip) }
この状態でまず
java.lang.IllegalStateException: The errors is not found in parameters.
at org.slim3.controller.validator.Validators.<init>(Validators.java:83)
が発生。この問題はこちら(Slim3 Gwt In Action)で判明。
params.put(ControllerConstants.ERRORS_KEY, new Errors());
Map 内の Erros を初期化されていないため例外が発生している、とのこと。ソース(Validators.java - slim3 - Project Hosting on Google Code)を見たら、確かにその通りだった。
これで解決と思いきや、v.validate() の結果が false になるようにテストで仕向けたところで、
java.lang.IllegalStateException: The bundle attached to the current thread is not found.
が発生。最初は何を怒られているのか、よく分からなかったのだが、落ち着いてバックトレースを見ると、
at org.slim3.util.ResourceBundleApplicationMessageDelegate.get(ResourceBundleApplicationMessageDelegate.java:57)
とあるので、ソース(ResourceBundleApplicationMessageDelegate.java - slim3 - Project Hosting on Google Code)を見てみると、application_*.properties の使用にあたってロケールが不明、ということのようだ。
なので、取りあえず v.validate() の前に
ApplicationMessage.setBundle( ControllerConstants.DEFAULT_LOCALIZATION_CONTEXT, new Locale("en"));
を追記することで解決した。
ただ、ここで問題なのが、Locale の件。
多言語対応させたいし、ユーザに設定などの面倒を掛けたくないので、ブラウザからの Accept-Language を拾って自動設定したいところなのだが、gwt で Request パラメータを拾うにはどうしたら良いのだろうか?
google 先生曰く
I need to parse GET parameter - Google Web Toolkit | Google Groups
Example JSP code:
<body> <% String foo = request.getParameter("foo"); if (foo == null || foo.trim().length() == 0) { foo = "default"; } %> <script language="javascript"> var parameters = { foo: "<%=foo%>" }; </script> <script language="javascript" src="my.gwt.Module.nocache.js"></script> </body>
Example Java code:
Dictionary parameters = Dictionary.getDictionary("parameters"); String foo = parameters.get("foo");
と、JSP の併用を推奨される。確かに一つの解決法ではあるのだが...美しくないなぁ(笑)
もう少し考えてみよう。