我有一些看起來像這樣的代碼
@Controller
public class FooController {
@RequestMapping(value = "/foos", method = POST)
public String createFoo(@ModelAttribute("FooDto")
@Valid FooDto fooDto, BindingResult bindingResult, Model model) {
var foo = fooMapper.toFooModel(fooDto);
if (bindingResult.hasErrors()) {
var fooDto1 = fooMapper.toFooDto(foo);
model.addAttribute("FooDto", fooDto1); // binding result disappears
...
}
...
還有一些對我的 Controller 類的測驗,如下所示:
@Test
void createFooWithValidationError() throws Exception {
perform(post("/foos")).andExpect(status().isOk())
.andExpect(model().attribute("foo", notNullValue()))
.andExpect(model().errorCount(1)); // this fails, no error/binding result exists!
}
測驗沒有成功,因為設定后沒有系結結果
model.addAttribute("FooDto", fooDto1);.
我知道,我可以設定
model.addAttribute("FooDto", fooDto);
從而系結結果不會消失。
但是我想知道為什么系結結果消失了。是否有一些彈簧魔術將系結結果系結到我的模型屬性的具體實體?是否有其他解決方法可以使上述代碼正常作業?
uj5u.com熱心網友回復:
我將深入研究 spring 代碼并找到我的答案:
model.addAttribute("FooDto", fooDto1);確實打電話
public ModelMap addAttribute(String attributeName, @Nullable Object attributeValue) {
Assert.notNull(attributeName, "Model attribute name must not be null");
put(attributeName, attributeValue); // calls BindingAwareModelMap
return this;
}
public class BindingAwareModelMap {
public Object put(String key, @Nullable Object value) {
removeBindingResultIfNecessary(key, value);
return super.put(key, value);
}
private void removeBindingResultIfNecessary(Object key, @Nullable Object value) {
...
if (bindingResult != null && bindingResult.getTarget() != value) {
remove(bindingResultKey); // Removes the binding result if target refernces to other instance
}
}
}
如您所見,系結結果是否參考了系結結果條目中的其他實體ModelMap。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/425488.html
標籤:春天 弹簧MVC spring-mvc 测试
上一篇:在控制器中映射之前轉換特定欄位
