2017-04-16 36 views
1

我試圖通過使用多個下拉菜單來從百里香傳遞產品ID列表。它輸出大小,但產品對象爲空。如果我在Expense類中創建List<String> product;並將expenseDetail替換爲addExpense.htmlproduct;有用。我試圖通過ExpenseDetail從百里香到彈簧啓動的對象列表

消費類

@Entity 
public class Expense { 
    //fields 

    @OneToMany(mappedBy = "expense", cascade = CascadeType.ALL) 
    @NotNull 
    private List<ExpenseDetail> expenseDetail; 
    //getters and setters 
} 

ExpenseDetail類

public class ExpenseDetail { 
    //fields 

    @ManyToOne 
    @JoinColumn(name = "expense_id") 
    private Expense expense; 

    @ManyToOne 
    @JoinColumn(name = "product_id") 
    private Product product; 

    //getters and setters 

}

爲合格產品addExpense.html

<form th:action="@{/expense/new}" th:method="post" th:object="${expense}"> 
    <select id="product" th:field="*{expenseDetail[0]}"> 
     <option value="" th:text="#{item.select.prompt}"></option> 
     <option th:each="product: ${products}" th:value="${product.id}" th:text="${product.name}"></option> 
    </select> 
    <select id="product" th:field="*{expenseDetail[1]}" > 
     <option value="" th:text="#{item.select.prompt}"></option> 
     <option th:each="product: ${products}" th:value="${product.id}" th:text="${product.name}"></option> 
    </select> 
    <button type="submit" name="Save expense">Save Expense</button> 

</form><!-- ends expense form --> 

ExpenseController

@Controller 
public class ExpenseController { 
    @PostMapping("/expense/new") 
    public String addExpense(@Valid Expense expense, BindingResult result, Model model){ 
     //This prints the list of size 2 
     System.out.println(expense.getExpenseDetail().size()); 

     List<ExpenseDetail> el=expense.getExpenseDetail(); 
     el.forEach(e->{ 
      System.out.println(e.getProduct()); //this is null 
     }); 
     return "addExpense"; 
    } 
} 

回答

0

在選擇字段應該是你想要的選項(產品ID)去的價值,所以你應該使用th:field="*{expenseDetail[0].product.id}"

然後這會給你一個Product包含你的ExpenseDetail對象中選定的ID。如果在select中沒有選擇任何內容,那麼您將在Product中得到一個空ID,您需要在服務器端處理這些ID或使用JavaScript排除該字段爲空。

請記住,Thymeleaf對您的Product物體或其來源不瞭解。它只會填充表單中顯示的字段,所以其他內容如name在POST處理程序中將爲空。通常情況下,您只需拿到ID並使用它從數據庫或其他任何地方重新加載對象。