2017-07-07 2 views
1

Ich entwickle eine Anwendung mit Spring Boot und Thymeleaf, in der ich eine Package-Klasse und eine User-Klasse habe.Thymeleaf + Spring Boot: Objekterstellung mit verwandtem Objekt (Form & Return)

Paket Klasse:

@Entity 
@Table(name = "table_package") 
public class Package { 

    @Id 
    @GenericGenerator(name = "gen_id", strategy = "increment") 
    @GeneratedValue(generator = "gen_id") 
    private Integer id; 

    @ManyToOne 
    @JoinColumn(name = "userid") 
    @JsonBackReference 
    private User package_owner; 
// private Integer userid; 

    private String package_name; 

    @OneToMany(mappedBy = "pkg") 
    @JsonBackReference 
    private Set<Article> articles; 

    @ManyToOne 
    @JoinColumn(name = "package_statusid") 
    @JsonBackReference 
    private PackageStatus packageStatus; 
// private Integer package_statusid; 

    private String notes; 

    public Integer getId() { 
     return id; 
    } 

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

    public User getPackage_owner() { 
     return package_owner; 
    } 

    public void setPackage_owner(User package_owner) { 
     this.package_owner = package_owner; 
    } 

// public Integer getUserid() { 
//  return userid; 
// } 
// 
// public void setUserid(Integer userid) { 
//  this.userid = userid; 
// } 

    public String getPackage_name() { 
     return package_name; 
    } 

    public void setPackage_name(String package_name) { 
     this.package_name = package_name; 
    } 

    public Set<Article> getArticles() { 
     return articles; 
    } 

    public void setArticles(Set<Article> articles) { 
     this.articles = articles; 
    } 

    public PackageStatus getPackageStatus() { 
     return packageStatus; 
    } 

    public void setPackageStatus(PackageStatus packageStatus) { 
     this.packageStatus = packageStatus; 
    } 

    public String getNotes() { 
     return notes; 
    } 

    public void setNotes(String notes) { 
     this.notes = notes; 
    } 

    @Override 
    public String toString() { 
     return "Package{" + 
       "id=" + id + 
       ", package_owner=" + package_owner + 
       ", package_name='" + package_name + '\'' + 
       ", articles=" + articles + 
       ", packageStatus=" + packageStatus + 
       ", notes='" + notes + '\'' + 
       '}'; 
    } 
} 

Benutzerklasse:

@Entity 
@Table(name = "table_user") 
public class User { 

    @Id 
    @GenericGenerator(name="gen_id" , strategy="increment") 
    @GeneratedValue(generator="gen_id") 
    private Integer id; 

    @OneToMany(mappedBy = "package_owner") 
    @JsonBackReference 
    private Set<Package> packages = new HashSet<Package>(); 

} 

Ich bin Codierung eines Bildschirms für den Beipackzettel

Paket hinzufügen/Insert:

<form action="#" th:action="@{/packages/add}" th:object="${Package}" method="post"> 
    <table class="table stripped-table" id="article-table"> 
     <tr> 
      <th> 
       User: 
      </th> 
      <td> 
       <input type="text" id="user-search"/> 
       <input type="text" th:value="*{user.id}" hidden="hidden" th:required="required"/> 
      </td> 
     </tr> 
     <tr> 
      <th> 
       Package: 
      </th> 
      <td> 
       <input type="text" th:field="*{package_name}" th:required="required"/> 
      </td> 
     </tr> 
    </table> 
    <input type="submit" id="submit" value="Add" /> 
</form> 

Bevor ich das obje erzählte cts zwischen ihnen Ich benutzte JavaScript's Autocomplete, um den Namen auf der 'Benutzersuche' zu schreiben, den Wert in die Eingabe user_id einzufügen und diese einfach an meinen Controller zu übergeben.

Aber jetzt, wo ich die Beziehung zwischen den beiden Objekten jedes Mal erstellt habe ich versuchen, die Vorlage ich diesen Fehler zu laden:

Invalid property 'user' of bean class [com.app.model.Package]: Bean property 'user' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

Ich habe an der Getter und Setter suchen, sondern kann finde kein Problem. Ich bin auch neugierig, wie die Rückgabe auf meinem Controller gehandhabt werden soll, aber ich nehme an, würde das ganze Objekt vor der Speicherfunktion auf der DB einfügen. Irgendwelche Ideen?

Vielen Dank im Voraus.

EDIT Sorry für die Verzögerung, ich war auf einer Geschäftsreise.

Hier ist der Controller:

@RequestMapping(value = "add", method = RequestMethod.GET) 
public ModelAndView addPackageForm(Model model){ 

    List<PackageStatus> packageStatuses = packageStatusRepository.findAll(); 

    model.addAttribute("Package", new Package()); 
    model.addAttribute("PackageStatus", packageStatuses); 
    ModelAndView mav = new ModelAndView("packages/add"); 
    mav.addObject("page_title", "Test: Add Package"); 
    mav.addObject("template_primary", "packages"); 
    mav.addObject("template_secondary", "add"); 
    return mav; 
} 
+0

Ich empfehle Ihnen das MVC-Muster –

+0

Wenn Sie 'package_owner' anstelle von Benutzer verwenden, funktioniert es? Mein Argument ist, dass Sie kein Feld namens "user" im Paket haben, sondern nur einen Feldnamen "user" "package_owner". –

+0

Können Sie uns den Controller zeigen? –

Antwort

0

Sie müssen den richtigen Feldnamen Ihrer Klasse verwenden, so schalten user für package_owner oder wie Sie in Ihrem Kommentar haben, können Sie das Gegenteil tun.

+1

Ich tat tatsächlich das Gegenteil, nur den Instanznamen des Benutzers von 'package_owner geändert 'zu' user' aber ja, es hat funktioniert. –

Verwandte Themen