繁体   English   中英

路径变量读取为字符串而不是数字 Spring 错误

[英]Path variable read as a String rather than as a number Spring error

http://localhost:8080/basket/delete/%7BbasketId%7D?basketId=7&bookTitle=Ritle2&author=Rauther2&publisher=Publisher&quantity=1&price=5.0

上面的 URL 是在我的 Spring 应用程序中单击“从篮子中删除项目”按钮时搜索的内容。 控制器应该接收此篮子 ID(在本例中为 = 7)并将其从篮子中删除。 但是,我收到以下错误,因为它似乎在“{basketId}”中读取而不是 Id 本身:

[org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; nested exception is java.lang.NumberFormatException: For input string: "{basketId}"]

为什么会发生这种情况,我如何确保它采用了basketId 的值?

HTML:

 <tr th:each="basketItem : ${basket}"> <form action="/basket/delete/{basketId}" method="delete"> <td> <input name="basketId" th:value="${basketItem.basketId}" readonly> </td> <td> <input name="bookTitle" th:value="${basketItem.bookTitle}" readonly> </td> <td> <input name="author" th:value="${basketItem.author}" readonly> </td> <td> <input name="publisher" th:value="${basketItem.publisher}"readonly> </td> <td> <input name="quantity" th:value="${basketItem.quantity}" readonly> </td> <td> <input name="price" th:value="${basketItem.price}" readonly> </td> <td> <button > Delete from basket</button></td> </form> </tr>

篮子控制器:

@DeleteMapping("/basket/delete/{basketId}")
 String deleteBook(@PathVariable  Long basketId, Model model) {
    System.out.println("Delte mapping : " + basketId);
    if (basketRepository.existsById(basketId)){
        basketRepository.deleteById(basketId);
    }
    else {
        System.out.println("Item does not exist!");
    };
    //basketRepository.save(basket);
    model.addAttribute("basket", basketRepository.findAll());
    return "basket/list";
}

@GetMapping("/basket/delete/{basketId}")
public String deleteItem(@PathVariable Long basketId,Model model) {
    System.out.println("Get mapping : " + basketId);
    Basket basketItem = basketRepository.findById(basketId)
            .orElseThrow();
    basketRepository.delete(basketItem);

    model.addAttribute("basket", basketRepository.findAll());

    return "basket/list";
}

篮子:

package springLibrary.domain;

import javax.persistence.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

@Entity
public class Basket {

 
    private @Id
    @GeneratedValue
    Long basketId;
    private String bookTitle;
    private String author;
    private String publisher;
    private int quantity;
    private double price;


    public Basket() {
    }

    public Basket(String bookTitle, String author, String publisher, int quantity, double price) {

        this.bookTitle = bookTitle;
        this.author = author;
        this.publisher = publisher;
        this.quantity = quantity;
        this.price = price;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Basket basket = (Basket) o;
        return Objects.equals(bookTitle, basket.bookTitle);
    }

    @Override
    public int hashCode() {
        return Objects.hash(bookTitle);
    }

    @Override
    public String toString() {
        return "Basket{" +
                "basketId=" + basketId +
                ", bookTitle='" + bookTitle + '\'' +
                ", author='" + author + '\'' +
                ", publisher='" + publisher + '\'' +
                ", quantity=" + quantity +
                ", price=" + price +
                '}';
    }

    public Long getBasketId() {
        return basketId;
    }

    public void setBasketId(Long basketId) {
        this.basketId = basketId;
    }

    public String getBookTitle() {
        return bookTitle;
    }

    public void setBookTitle(String bookTitle) {
        this.bookTitle = bookTitle;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getPublisher() {
        return publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public double getPrice() {
        return price;
    }

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

谢谢@M。 Deinum 为此 - 它被读取为字符串的原因是由于操作本身的格式。

在 Thymeleaf 中,它的结构应该是这样的:

<form th:action="@{/basket/delete/{basketId}(basketId=${basketItem.basketId})}" method="delete">

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM