Spring嵌套对象在提交表单时变为null
我试图用thymeleaf发布数据,命令模型有两个嵌套对象,一个是获取数据,另一个是获取null。我很困惑,虽然使用了相同的概念和代码,但幕后发生了什么 请注意,我在日志中获取的是People对象的数据,但不是Project对象的数据,尽管使用的代码相同。请帮忙 表单片段Spring嵌套对象在提交表单时变为null,spring,spring-mvc,spring-data-jpa,thymeleaf,spring-form,Spring,Spring Mvc,Spring Data Jpa,Thymeleaf,Spring Form,我试图用thymeleaf发布数据,命令模型有两个嵌套对象,一个是获取数据,另一个是获取null。我很困惑,虽然使用了相同的概念和代码,但幕后发生了什么 请注意,我在日志中获取的是People对象的数据,但不是Project对象的数据,尽管使用的代码相同。请帮忙 表单片段 <form th:fragment="form" method="post" th:object="${expense}" th:action="@{/createexpense}"> <input typ
<form th:fragment="form" method="post" th:object="${expense}" th:action="@{/createexpense}">
<input type="hidden" th:field="*{expenseId}" />
<div class="form-group">
<label class="col-md-4 control-label" for="textarea">Expense Description</label>
<div class="col-md-4">
<textarea class="form-control" id="textarea" th:field="*{description}" name="textarea">Expense Description</textarea>
</div>
</div>
<div class="form-group">
<label class="col-md-4 control-label" for="textinput">Amount</label>
<div class="col-md-4">
<input id="textinput" name="textinput" type="text" placeholder="Enter Amount" th:field="*{amount}" class="form-control input-md">
</div>
</div>
<div class="form-group">
<label class="col-md-4 control-label" for="textinput">Project</label>
<div class="col-md-4">
<select class="form-control" id="sel1" th:field="*{project}">
<option th:each="project: ${projects}" th:value="${{project.projectId}}" th:text="${project.name}">1</option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-md-4 control-label" for="textinput">People</label>
<div class="col-md-4">
<select class="form-control" id="sel1" th:field="*{people}" >
<option th:each="people: ${peoples}" th:value="${people.id}" th:text="${people.name}">1</option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-md-4 control-label" for="textinput">Expense Type</label>
<div class="col-md-4">
<select class="form-control" id="sel1" th:field="*{expenseType}">
<option th:each="exp: ${expenseTypes}" th:value="${exp}" th:text="${exp}">1</option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-md-4 control-label" for="textinput">Create
Expense</label>
<div class="col-md-4">
<input type="submit" class="btn btn- danger" value="Submit"/
</div>
</div>
控制器代码段
@PostMapping(path="/createexpense")
public Expense addExpense(@ModelAttribute("expense") Expense expense ,BindingResult result){
log.debug(expense.toString());
expense.setPeople(peopleService.getPeople(expense.getPeople().getId()));
expense.setProject(flatProjectService.getFlatProjectById(expense.getProject().getProjectId()));
return expenseService.createExpense(expense);
}
@GetMapping(path="/createexpense")
public ModelAndView addExpense(ModelAndView modal){
//adding projects list and people list in expense view
modal.addObject("projects", flatProjectService.getAllProjects());
modal.addObject("peoples", peopleService.getAllPeoples());
modal.setViewName("createexpense");
modal.addObject("expense", new Expense());
modal.addObject("expenseTypes", ExpenseType.values());
return modal;
}
错误日志
2018-07-22 18:22:44.010 DEBUG 25500 --- [nio-8080-exec-5] c.d.b.controller.HomeController : Expense(expenseId=null, description=hello, people=People(id=2, name=Avinash, peopleType=null, phoneNo=9504974665, address=Beside Maa Clinic, expense=[], createdDate=2009-06-01 13:45:30.0, updatedDate=2009-06-01 13:45:30.0), amount=5000.0, createdAt=null, updatedAt=null, project=null, expenseType=PAID)
2018-07-22 18:22:44.090 ERROR 25500 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
查看您的HTML逻辑。我怀疑问题在项目循环中 您正在定义
th:field=“*{project}”
但在选项中使用as
pro
理想情况下应该是这样
<div class="form-group">
<label class="col-md-4 control-label" for="textinput">Project</label>
<div class="col-md-4">
<select class="form-control" id="sel1" th:field="*{project}">
<option th:each="project: ${projects}" th:value="${project.projectId}"
th:text="${pro.name}">1</option>
</select>
</div>
</div>
项目
1.
能否添加如何进行ajax调用。。在控制台中查看POST callI中发送的JSON,我没有使用ajax,尽管这是发送给控制器的JSONexpenseId=&description=hello&amount=7000&project=2&people=2&expenseType=PAID&textinput=
您将人员作为2传递,但在Controller中您已写入expense.getPeople().getId()。这是行不通的。因此,调用后的格式将与Expense ObjectPeople对象不匹配。您可以在日志中看到,Ashish,但问题是为什么不分析Project对象。还有其他方法吗?请发布异常的完整堆栈跟踪,并指出堆栈跟踪与您发布的代码中的匹配行。尝试过,但没有成功。在逻辑上,您如何发送HTML显示数据或发送数据存在一些问题。不是在后台…Ashish,我已经编辑了我的问题,整个表单现在都发布了。嘿,对于项目th,你有th:value=“${project.projectId}”不应该是th:value=“${project.projectId}”单个花括号,但问题没有解决。我已经添加了一个字段projectd,因此继续这个问题。
<div class="form-group">
<label class="col-md-4 control-label" for="textinput">Project</label>
<div class="col-md-4">
<select class="form-control" id="sel1" th:field="*{project}">
<option th:each="project: ${projects}" th:value="${project.projectId}"
th:text="${pro.name}">1</option>
</select>
</div>
</div>