2

Item クラスと Category クラスがあります。Item クラスには、Category クラスへの参照があります。

アイテムクラスは以下の通りです。

@Entity
@Table(name = "ITEMS")
public class Item {

@OneToOne
private Category category;
    public Category getCategory() {
        return category;
    }

    public void setCategory(Category category) {
        this.category = category;
    }
}

カテゴリ クラスは次のとおりです。

package com.easypos.models;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Size;

@Entity
@Table(name="category")
public class Category implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private int id;
    @Size(min = 2, max = 30)
    @Column(name = "CATEGORY_NAME", nullable = false)
    private String categoryName;
    @Column(name = "CATEGORY_REMARK", nullable = true)
    private String categoryDescription;


    public int getId() {
        return id;
    }

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

    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName.trim();
    }

    public String getCategoryDescription() {
        return categoryDescription;
    }

    public void setCategoryDescription(String categoryDescription) {
        this.categoryDescription = categoryDescription;
    }



    @Override
    public String toString() {
        return this.categoryName;
    }



}

私のコントローラーメソッドは次のとおりです

@RequestMapping(value = "/add", method = RequestMethod.GET)
    public String create(Model model) {
        item = new Item();
        model.addAttribute("title", "Add Item");
        model.addAttribute("categories", categoryService.findAll());
        model.addAttribute("suppliers", supplierService.findAll());
        model.addAttribute(item);
        return "item/create";
    }

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String savePorduct(Model model, @ModelAttribute("item") @Valid Item item, BindingResult result,
            RedirectAttributes redirectAttributes) {
        itemValidator.validate(item, result);
        if (result.hasErrors()) {
            model.addAttribute("title", "Add Item");
            model.addAttribute("categories", categoryService.findAll());
            model.addAttribute("suppliers", supplierService.findAll());
            return "item/create";
        }
        redirectAttributes.addFlashAttribute("message", "Item successfully saved.");
        itemService.saveitem(item);
        return "redirect:/item/";
    }

私のJspファイルでは、次のコードを使用して選択ボックスにカテゴリを表示しました。

has-error "> カテゴリ

<div class="col-sm-9"> <sf:select path="category" cssClass="form-control"> <sf:options items='${categories}' itemValue='id'/> </sf:select> <p><sf:errors path="category" /></p> </div> </div>

フォームを送信すると、マイJspファイルに「一致するエディターまたは変換戦略が見つかりません」というエラーが表示されます。完全なエラー ログは次のとおりです。

Failed to convert property value of type [java.lang.String] to required type [com.easypos.models.Category] for property category; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.easypos.models.Category] for property category: no matching editors or conversion strategy found
4

3 に答える 3

0

ここで ITEM テーブルは冗長です。Item クラスには 1 つの属性しか含まれておらず、1 対 1 の関係であるためです。したがって、このエンティティ クラスは避ける必要があります。もう 1 つ、すべてのエンティティ クラスには @Id アノテーション付きの主キーが必要です。

Item クラスが Category タイプ属性を取り、jsp フォームからは Category タイプ属性がないことは明らかです。例:

<form action="action_url" method="POST">
    <input type="text" name="a"/>
    <input type="text" name="b"/>
    <input type="text" name="c"/>
    <input type="submit" value="Submit"/>
</form>

この jsp フォームの場合、エンティティ/モデル クラスは、

@Entity
@Table(name = "CATEGORY")
public class Category implements Serializable {

    @Id
    @GeneratedValue
    @Column(name = "ID")
    private Long id;

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

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

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

    ...Getter and Setter here....
}

自動バインドする場合は、フォーム要素名とモデル属性名が同じであることを確認する必要があります。しかし、jsp ページには「category」という名前の要素がなく、このタイプのフォーム要素を作成することはできません。これは、Category がユーザー定義のクラスであり、html がこのタイプの要素を認識していないためです。あなたが要点を得たことを願っています。

要素をバインドするには、Category オブジェクトを使用する必要があります。このような:

@RequestMapping(value = "/add", method = RequestMethod.POST)
public String savePorduct(Model model, @ModelAttribute("category") Category category,  BindingResult result) {
--other logic here--
}

これで問題が解決することを願っています。

于 2016-08-19T16:47:25.977 に答える
0

一つはっきりさせておこう。ネストされたオブジェクト フィールドをバインドする場合は、html 要素の 'name' 属性を name="object.field" のように設定する必要があります。ここでは、select 要素 (文字列) の値をItem クラスのカテゴリ フィールド (カテゴリ タイプ)。これはうまくいきません。

試す

path = "category.categoryName"

そして、それが機能するかどうかを確認してください。

とにかく、Item Entityに主キーが必要です。

于 2016-08-19T18:52:30.657 に答える