Передача сопоставленного объекта через форму: выберите теги - PullRequest
0 голосов
/ 19 декабря 2018

Я получаю ошибку 400 Bad Request каждый раз, когда пытаюсь передать весь объект через форму: select.

HTTP Status 400 - Bad Request

Тип отчета о состоянии

Описание Сервер не может или не будет обрабатывать запрос из-за чего-то, что воспринимается как ошибка клиента (например, синтаксис неверно сформированного запроса, неправильное формирование кадра сообщения о запросе или обманчивая маршрутизация запроса).

Это моя форма выбора:

<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 + "]";
}

}

То, что я хочу, этовыбранная категория продукта для добавления в продукт.

1 Ответ

0 голосов
/ 19 декабря 2018

Spring ожидает, что productCategory будет объектом, но это name из productCategory, как указано в теге.

вам нужно попробовать что-то вроде:

    <form:select path="productCategory.name">
        <form:options items="${productCategories}" itemLabel="name" itemValue= "name"/>
    </form:select>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...