Spring @ModelAttribute和翻译请求参数绑定名称

时间:2010-12-29 00:42:04

标签: java spring

我正在努力将遗留项目转换为Spring(现在尝试尽可能少地调整)并且我遇到了将遗留参数映射/转换为模型属性对象的小问题。在考虑这个问题时我可能完全错了,但在我看来,将参数转换为特定的模型属性setter是通过创建模型属性的方法传递request参数并手动调用正确的setter:

@ModelAttribute("form")
public MyForm createMyForm(@RequestParameter("legacy-param") legacy) {
    MyForm myForm = new MyForm();
    myForm.setNewParam(legacy);
    return myForm;
}

我不一定要更改请求参数名称,因为一些javascript和JSP依赖于它的命名方式,但有没有办法做这样的事情?或者是否有不同的方法将请求参数映射/转换为模型属性?

public class MyForm {
    @ParameterName("legacy-param")
    private String newParam;

    public void setNewParam(String value) { ... }

    public String getNewParam() { ... }
}

@Controller
public class MyController {

    @RequestMapping("/a/url")
    public String myMethod(@ModelAttribute("form") MyForm myForm, BindingResult result) { ... }
}

2 个答案:

答案 0 :(得分:2)

你编写模型属性方法的方式确实很奇怪。我并不完全清楚你实际上要做什么。假设有很多参数,你最终会在ModelMap中得到大量的MyForm实例。创建模型属性的更“正常”方式如下:

@ModelAttribute("legacyParamNotCamel")
public MyForm createMyForm(@RequestParameter("legacy-param-not-camel") String legacy) {
    return legacy;
}

然后在JSP中,您可以直接在表达式语言中引用它。如,

<c:out value="${legacyParamNotCamel}"/>

如果要将它们放在表单支持对象上,则需要在创建对象的单个方法中完成所有操作,而不是在每个方法中创建它的新副本。 (假设您的表单有多个与之关联的参数。)

- 看起来你真正想要做的就是在 web数据绑定器获取它之前转换请求中的参数名称,以便你可以将奇怪命名的参数绑定到java bean上吗?为此,您需要使用在绑定过程开始之前转换名称的拦截器,或者创建自己的数据库子类,而不是使用属性名称转换映射。

答案 1 :(得分:0)

您将@ModelAttribute放在方法级别,但意图似乎更像是一个formBackingObject,因此我们应该处理方法参数级别

有区别。

我在我的博客上按照 Spring 3 MVC:在JSP中使用@ModelAttribute 中的示例({3}}

进行了解释