Spring嵌套对象在提交表单时变为null

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

我试图用thymeleaf发布数据,命令模型有两个嵌套对象,一个是获取数据,另一个是获取null。我很困惑,虽然使用了相同的概念和代码,但幕后发生了什么

请注意,我在日志中获取的是People对象的数据,但不是Project对象的数据,尽管使用的代码相同。请帮忙

表单片段

<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,尽管这是发送给控制器的JSON
expenseId=&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>