2016-09-10 19 views
1

私は春のThymeleafで新しく、EmployeeのコンテンツリストCertificateを新しく追加したいと思います。私はコントローラから渡されたCertificateのリストをバインドするためにth:checkboxを使用しました。マイコード:Thymeleafチェックボックスバインドリストオブジェクト

コントローラ

@RequestMapping(value = "/add" , method = RequestMethod.GET) 
public String add(Model model) { 
    model.addAttribute("employee",new Employee()); 
    model.addAttribute("certificates",certificateService.getList()); 
    return "add"; 
} 

@RequestMapping(value = "/add" , method = RequestMethod.POST) 
public String addSave(@ModelAttribute("employee")Employee employee) { 
    System.out.println(employee); 
    return "list"; 
} 

従業員

@Entity 
@Table(name = "employee") 
public class Employee { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "ID") 
private int id; 

@Column(name = "Name") 
private String name ; 


@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(name="emp_cert", 
      joinColumns={@JoinColumn(name="employee_id")}, 
      inverseJoinColumns={@JoinColumn(name="certificate_id")}) 
private List<Certificate> certificates; 



public Employee() { 
    if(certificates == null) 
     certificates = new ArrayList<>(); 
} 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 


public void setName(String name) { 
    this.name = name; 
} 


public List<Certificate> getCertificates() { 
    return certificates; 
} 


public void setCertificates(List<Certificate> certificates) { 
    this.certificates = certificates; 
} 

@Override 
public String toString() { 
    return "Employee [id=" + id + ", name=" + name + "certificates size = "+certificates.size()+" ]"; 
} 


@Entity 
@Table(name = "certificate") 
public class Certificate { 

証明書

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "Id") 
private int id; 

@Column(name = "name") 
private String name ; 


@ManyToMany(mappedBy="certificates") 
private List<Employee> employees ; 


public Certificate() { 
    if(employees == null) 
     employees = new ArrayList<>(); 
} 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public List<Employee> getEmployees() { 
    return employees; 
} 

public void setEmployees(List<Employee> employees) { 
    this.employees = employees; 
} 

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + id; 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Certificate other = (Certificate) obj; 
    if (id != other.id) 
     return false; 
    return true; 
} 
クライアントから送信されたリクエストが文法的に間違っていた -

HTMLフォーム

<form action="#" th:action="@{/employee/add}" th:object="${employee}" method="post"> 
     <table> 
      <tr> 
      <td>Name</td> 
      <td><input type="text" th:field="*{name}"></td> 
      </tr> 
      <tr> 
      <td>Certificate</td> 
      <td> 
       <th:block th:each="certificate , stat : ${certificates}"> 
       <input type="checkbox" th:field="*{certificates}" name="certificates" th:value="${certificate.id]}"/> 
       <label th:text="${certificate.name}" ></label> 
       </th:block> 
      </td> 
      </tr> 
      <tr> 
      <td colspan="2"> 
       <input type="submit" value="Add"/></td> 
      </tr> 
     </table> 
     </form> 

は、問題は私が

400を得たフォームを送信しようとしているときに、あります。

うまくいけば、誰かがこれを解決する方法を提案してくれることを望みます。

+0

こんにちは、あなたはそれを解決するために管理するのですか?私は同様の問題で立ち往生しています。 – agilob

+0

こんにちは、私は以下の解決策でそれを追加します –

答えて

5

Iはアレイのコントローラする証明 IDを送信することによって、それを解決するためにカスタムソリューションを使用し、RequestParamとしてそれを受け取りました。必要な変更は以下で定義されます。

ビュー

  <tr> 
      <td>Certificate</td> 
      <td> 
       <th:block th:each="certificate : ${certificates}"> 
       <input type="checkbox" name="cers" th:value="${certificate.id}"/> 
       <label th:text="${certificate.name}"></label> 
       </th:block> 
      </td> 
      </tr> 

コントローラ

@RequestMapping(value = "/add" , method = RequestMethod.POST) 
public String addSave(
     @ModelAttribute("employee")Employee employee , 
     @RequestParam(value = "cers" , required = false) int[] cers , 
     BindingResult bindingResult , Model model) { 

if(cers != null) { 
    Certificate certificate = null ; 
    for (int i = 0; i < cers.length; i++) { 

     if(certificateService.isFound(cers[i])) { 
      certificate = new Certificate(); 
      certificate.setId(cers[i]); 
      employee.getCertificates().add(certificate); 
     } 
    } 
     for (int i = 0; i < employee.getCertificates().size(); i++) { 
      System.out.println(employee.getCertificates().get(i)); 
     } 
} 
+0

ああ、ありがとう、私はすべてを複雑にしていた – agilob