我想我可能已经发现了弹簧网络活页夹的一个关键错误,或者更可能的是,我正在做一些可怕的错误。基本上,来自一个servlet请求的数据以某种方式被复制到另一个请求。
Spring version 4.1.5
我有一个带有1个参数的简单模型对象。
public class MyModelAttribute {
private String myModelParameter;
public String getModelParameter() {
return myModelParameter;
}
public void setModelParameter(String myModelParameter) {
this.myModelParameter = myModelParameter;
}
}
我在我的控制器中为我的对象初始化了一个活页夹
@InitBinder("myModelAttribute")
protected void initMyModelBinder(WebDataBinder binder) {
binder.setValidator(myValidator);
binder.registerCustomEditor(String.class, new StringTrimmerEditor(false));
}
然后有一个像这样的控制器方法
public ModelAndView someRequestMapping(@Valid @ModelAttribute("myModelAttribute") MyModelAttribute myModelAttribute,
BindingResult bindingResult) {
...
}
我创建了一个测试,用命令阻止这个控制器,有时我看到一些可怕的东西。我的模型上的参数不是提交的内容,而是先前请求中提交的不同值。它可以使一个用户获得另一个用户的数据。基本上,似乎数据绑定器上的目标对象是从早期保存的。如果我直接从请求中获取参数,那么它将是预期的参数。
答案 0 :(得分:0)
问题是StringTrimmer编辑器......它实际上并没有像我在代码中发布的那样设置。绑定器初始化就像这样。事实证明StringTrimmerEditor不是无状态的。所以答案是在问题中初始化活页夹。不像下面那样。
@InitBinder("myModelAttribute")
protected void initMyModelBinder(WebDataBinder binder) {
binder.setValidator(myValidator);
binder.registerCustomEditor(String.class, STRING_TRIMMER);
}
这里更好地描述了这个问题https://jira.spring.io/browse/SPR-12547