我正在努力将遗留项目转换为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) { ... }
}
答案 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}}
进行了解释