gwt な slim3 の Validators で悩む

gwtslim3 では 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 の併用を推奨される。確かに一つの解決法ではあるのだが...美しくないなぁ(笑)

もう少し考えてみよう。