2016-09-10 2 views
1

Ich bin neu in Thymeleaf mit Frühling, ich möchte neue die Inhaltsliste von Certificate hinzufügen. Ich habe th:checkbox verwendet, um die Liste Certificate zu binden, die vom Controller übergeben wurde. Meine Codes:Thymoleaf Checkbox binden Liste von Objekten

-Controller

@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"; 
} 

Bohnen

Mitarbeiter

@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 { 

Zertifikat

@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-Formular

<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> 

Das Problem ist, wenn ich versuche, das Formular senden ich habe

400 - Die Anfrage vom Client gesendet syntaktisch nicht korrekt war.

Hoffentlich hat jemand einen Vorschlag, wie man das löst.

+0

Hallo, haben Sie es geschafft, es zu lösen? Ich stecke mit ähnlichen Problemen fest. – agilob

+0

Hallo, ich werde es in Lösung unter –

Antwort

5

verwendet I individuelle Lösung, es zu lösen, durch Zertifikate ID senden in Array an die Steuerung und erhielt als RequestParam. Die erforderlichen Änderungen sind unten definiert.

Ansicht

  <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> 

-Controller

@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

hinzufügen Oh, danke, ich war über alles komplizierter – agilob

Verwandte Themen