java - Spring 和带有 select 的表单

标签 java spring data-binding

我正在使用 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/

相关文章:

java - 使用新参数重复 WebClient 获取

java - Spring Tool Suite 向导生成的 NoClassDefFoundError

mysql - Spring Hibernate - getLong() 的无效值 - 'United Kingdom - UTC +0:00'

c# - 动态更改DataTemplate的宽度

java - QueryDsl SpringData Jpa findAll 如何避免count()

java - JTextField 使用不当(可能)帮助创建 GUI

java - Spring MVC,如何在 View 中包含另一个 Controller / View (部分 View )

javascript - 直到我开始过滤才显示数据?

android - Android中如何实现Livedata和Databinding?

Java BMP 头文件