绑定器

时间:2016-05-25 03:20:30

标签: java spring spring-mvc concurrency

我想我可能已经发现了弹簧网络活页夹的一个关键错误,或者更可能的是,我正在做一些可怕的错误。基本上,来自一个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) {

...
}

我创建了一个测试,用命令阻止这个控制器,有时我看到一些可怕的东西。我的模型上的参数不是提交的内容,而是先前请求中提交的不同值。它可以使一个用户获得另一个用户的数据。基本上,似乎数据绑定器上的目标对象是从早期保存的。如果我直接从请求中获取参数,那么它将是预期的参数。

1 个答案:

答案 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