通过 form:select 标签传递映射对象

Passing mapped object through form:select tags

每当我试图通过 form:select 传递整个对象时,我总是收到 400 Bad Request 错误。

HTTP 状态 400 – 错误请求

输入状态报告

描述由于某些被认为是客户端错误(例如,格式错误的请求语法、无效的请求消息框架或欺骗性请求路由),服务器无法或不会处理请求。

这是我的 select 表格:

<html>
<head>
<title>Dodaj produkt do aukcji</title>
</head>
<body>

<form:form action="saveProduct${auction.id}" modelAttribute="newProduct" method="POST">
    <label>Nazwa:</label> <form:input path="name"/><br>
    <label>Cena:</label> <form:input path="price"/><br>
    <label>Kategoria:</label>
    <form:select path="productCategory">
        <form:options items="${productCategories}" itemLabel="name"/>
    </form:select><br>
    <input type="submit" value="Dodaj" class="save"/><br>
</form:form>

</body>
</html>

控制器:

@GetMapping("/addProductPage")
public String addProductPage(@RequestParam("auctionId") int id,Model theModel) {

    Collection <ProductCategory> pCategories = productCategoryService.getProductCategories();
    Auction auction = auctionService.getAuction(id);
    Product product = new Product();
    ProductCategory pCategory = new ProductCategory();
    theModel.addAttribute("auction", auction);
    theModel.addAttribute("newProduct", product);
    theModel.addAttribute("productCategories", pCategories);

    return "add-product";
}

@PostMapping("/saveProduct{someId}")
public String saveProduct(@ModelAttribute("newProduct") Product product, @PathVariable(value="someId") String someId) {

    Auction auction = auctionService.getAuction(Integer.parseInt(someId));
    Collection<Product> products = auction.getProducts();
    products.add(product);
    auction.setProducts(products);
    product.setAuction(auction);
    auctionService.saveAuction(auction);
    productService.saveProduct(product);


    return "redirect:/showMyAuctions";
}

产品实体:

@Entity
@Table(name="product")
public class Product {

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

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

@Column(name="price")
private float price;

@ManyToOne
@JoinColumn(name="category_id")
private ProductCategory productCategory;

@ManyToOne
@JoinColumn(name="auction_id")
private Auction auction;

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 float getPrice() {
    return price;
}

public void setPrice(float price) {
    this.price = price;
}

public ProductCategory getProductCategory() {
    return productCategory;
}

public void setProductCategory(ProductCategory productCategory) {
    this.productCategory = productCategory;
}

public Auction getAuction() {
    return auction;
}

public void setAuction(Auction auction) {
    this.auction = auction;
}

@Override
public String toString() {
    return "Product [id=" + id + ", name=" + name + ", price=" + price + ", productCategory=" + productCategory
            + "]";
}


}

产品类别实体:

@Entity
@Table(name="product_category")
public class ProductCategory {

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

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

@OneToMany(mappedBy="productCategory", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
Collection<Product> products;

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 Collection<Product> getProducts() {
    return products;
}

public void setProducts(Collection<Product> products) {
    this.products = products;
}

@Override
public String toString() {
    return "ProductCategory [id=" + id + ", name=" + name + "]";
}

}

我想要的是要添加到产品中的所选产品类别。

Spring 期望 productCategory 是一个对象,但它是标签中指定的 productCategoryname

你需要尝试类似的东西:

    <form:select path="productCategory.name">
        <form:options items="${productCategories}" itemLabel="name" itemValue= "name"/>
    </form:select>