我可能应该指出,Spring 本身并不一定对这个问题至关重要,但是我在使用 Spring 时遇到了这种行为,所以这个问题使用了我在 Spring 中遇到的情况。
我有一个控制器类,它将请求GET
和POST
请求映射到特定表单的同一组 URL。此表单对于不同的语言环境有不同的 URL,但是对于GET
请求只有一种方法,而对于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
工作得很好。您会注意到String
用于@RequestMapping
值的数组是相同的。我想要做的是将这些 URL 放在一个位置(理想情况下是static final
控制器中的一个字段),这样当我们添加新 URL(对应于未来本地化站点中的表单)时,我们可以将它们添加到一个位置。所以我尝试了对控制器的这种修改:
@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
在我的情况下)将作为“常量”传递。我在这里的怀疑是,数组文字必须以这样一种方式动态构建,即在解析属性时它不会被初始化。Array
String
value
我觉得用基本的 Java 知识来弄清楚这不应该是一件难事,但是经过一些研究后,我无法找到任何答案。有人可以证实我的怀疑并给出一个引用或很好的解释为什么会这样,或者否认我的怀疑并解释实际问题是什么?
注意:我不能简单地将 URL 组合到Path Pattern中,因为每个表单 URL 都使用其本地化站点的语言,并且不可能进行匹配。例如,我只是将上面的“/{locale}-form.html”字符串作为我的 URL。