2

おそらく、Spring自体がこの質問にとって必ずしも重要ではないことを指摘する必要がありますが、Springを使用しているときにこの動作に遭遇したため、この質問では、Springでこれに遭遇した状況を使用します。

特定のフォームの同じURLセットに対するリクエストGETとリクエストをマップするコントローラークラスがあります。POSTこのフォームのURLはロケールごとに異なりますが、フォームのコントローラーレベルのロジックはロケールサイトごとに同じであるため、GETリクエストのメソッドは1つ、のメソッドは1つだけです(ただし、ロケールなど、ロジックのより深い部分) POST-特定の検証、異なる場合があります)。例:

@Controller
public class MyFormController {

    // GET request
    @RequestMapping(value={"/us-form.html", "/de-form.html", "/fr-form.html"},
            method={RequestMethod.GET})
    public String showMyForm() {
        // Do some stuff like adding values to the model
        return "my-form-view";
    }

    // POST request
    @RequestMapping(value={"/us-form.html", "/de-form.html", "/fr-form.html"},
            method={RequestMethod.POST})
    public String submitMyForm() {
        // Do stuff like validation and error marking in the model
        return "my-form-view"; // Same as GET
    }
}

このように書くと、フォームGETと動作は問題なく動作します。値に使用される配列が同一でPOSTあることに気付くでしょう。私がやりたいのは、それらのURLを1つの場所(理想的にはコントローラーのフィールド)に配置して、新しいURL(将来のローカライズされたサイトのフォームに対応)を追加するときに、それらを1つの場所に追加できるようにすることです。だから私はコントローラーにこの変更を試みました:String@RequestMappingstatic final

@Controller
public class MyFormController {

    // Moved URLs up here, with references in @RequestMappings
    private static final String[] MY_URLS =
            {"/us-form.html", "/de-form.html", "/fr-form.html"};

    // GET request
    @RequestMapping(value=MY_URLS, // <-- considered non-constant
            method={RequestMethod.GET})
    public String showMyForm() {
        // Do some stuff like adding values to the model
        return "my-form-view";
    }

    // POST request
    @RequestMapping(value=MY_URLS, // <-- considered non-constant
            method={RequestMethod.POST})
    public String submitMyForm() {
        // Do stuff like validation and error marking in the model
        return "my-form-view"; // Same as GET
    }
}

ここでの問題は、コンパイラがvalue属性が定数ではなくなったことについて文句を言うことです。Springではvalue定数でなければならないことは承知していますが、リテラルを含むリテラルでfinalフィールド(またはstatic final私の場合)を使用すると、 「定数」として渡されると思いました。ここでの私の疑いは、属性が解析されるときに初期化されないように、配列リテラルをその場で構築する必要があるということです。ArrayStringvalue

これはJavaの基本的な知識で理解するのは難しいことではないように感じますが、いくつかの調査の結果、答えを見つけることができなかったという何かが私を逃れています。誰かが私の疑惑を確認し、それがなぜそうなるのかについての引用または良い説明を与えることができますか、または私の疑惑を否定して実際の問題が何であるかを説明できますか?

注:各フォームURLはローカライズされたサイトの言語であるため、URLをパスパターンに単純に組み合わせることができず、それに一致することは不可能です。たとえば、上記の「/{locale}-form.html」文字列をURLとして指定するだけです。

4

1 に答える 1

6

そうです、これはSpringとは関係ありません。すべてのアノテーションパラメータはコンパイル時定数でなければなりません。これが基本的なJava言語のルールです。

配列参照をfinalとしてマークしても、これはまだ完全に合法であるため、カットされません。

MY_URLS[0] = "es-form.html";

また、そもそもそのようなURLにロケールを埋め込むことにどの程度固執していますか?レガシーリンクをエミュレートしていますか?Springには、ブラウザの実際のロケールを使用するためのサポートが多数組み込まれています。

于 2013-03-25T17:27:31.547 に答える