我正在使用 Spring 来填充表单中的项目,并使用 Controller 和 View 之间的对象传递:
域对象
public class Client {
private String name;
private int id;
private Bar bar;
// getters and setters omitted
}
public class Bar {
private Integer id;
private String name;
// getters and setters omitted
}
Controller
@RequestMapping(method = RequestMethod.GET, value = "/")
public String index(Model m) {
m.addAttribute("Client", new Client());
Bar o1 = new Bar();
o1.setName("n 1");
o1.setId(1);
Bar o2 = new Bar();
o2.setName("n 2");
o2.setId(2);
Bar o3 = new Bar();
o3.setName("n 3");
o3.setId(3);
Bar o4 = new Bar();
o4.setName("n 4");
o4.setId(4);
Bar o5 = new Bar();
o5.setName("n 5");
o5.setId(5);
List<Bar> orders = new ArrayList<Bar>();
orders.add(o1);
orders.add(o2);
orders.add(o3);
orders.add(o4);
orders.add(o5);
m.addAttribute("ordersList", orders);
return "index";
}
@RequestMapping(method = RequestMethod.POST, value = "/")
public String indexPost(@ModelAttribute("Client") Client g, BindingResult r) {
log.info(g.getId() + " " + g.getName());
log.info(g.getBar().getName());
return "index";
}
查看(index.jsp)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<form:form method="POST" modelAttribute="Client">
<form:label path="name">Name</form:label>
<form:input path="name" />
<form:label path="id">Id</form:label>
<form:input path="id" />
<form:label path="orders">Order</form:label>
<form:select path="bar" items="${ordersList}" />
<form:button>Insert</form:button>
</form:form>
</body>
</html>
问题
当我填写表单并提交时, Controller 在 log.info(g.getBar().getName()); 上抛出 NullPointerException;
我认为这是因为 getBar() 返回 null
。
我的这个数据绑定(bind)哪里错了?
最佳答案
您正在为模型设置一个新的 Client
对象,但该对象为空。首先尝试创建完整的 Client
对象,然后在 index()
方法中将其设置为模型。
编辑: 因此您需要该字段的属性编辑器。调整以下方法并将其添加到您的 Controller 中:
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Bar.class, "bar", new PropertyEditorSupport(Bar.class) {
@Override
public String getAsText() {
if(null != getValue()) {
return ((Bar) getValue()).getId();
} else {
return StringUtils.EMPTY;
}
}
@Override
public void setAsText(String text) {
if(!StringUtils.isEmpty(text)) {
setValue(UtilityClassUtils.getBarById(text));
}
}
});
}
关于java - Spring 和带有 select 的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14128572/