Passing mapped object through form:select tags

macias

I keep getting 400 Bad Request error whenever im trying to pass an entire object through form:select.

HTTP Status 400 – Bad Request

Type Status Report

Description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).

This is my select form:

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

Controller:

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

Product entity:

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


}

Product category entity:

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

}

What i want is the chosen product category to be added to the product.

stacker

Spring expect productCategory to be an object but it's name of productCategory as specified in tag.

you need to try something like:

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

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related