Java 正在尝试通过thymeleaf/spring引导中的@PathVariable传递两个对象

Java 正在尝试通过thymeleaf/spring引导中的@PathVariable传递两个对象,java,spring,thymeleaf,Java,Spring,Thymeleaf,我试图使用@PathVariable注释提取两个参数,但由于java向我抛出了一个错误,它将条目id(我当前的条目id长度)作为字符串引用,因此未能成功 控制器: @PostMapping("/purchaseToner/{tid}/{bid}") public String buyToner(Model model, @PathVariable("tid") Long tid, @PathVariable("bid") Long b

我试图使用@PathVariable注释提取两个参数,但由于java向我抛出了一个错误,它将条目id(我当前的条目id长度)作为字符串引用,因此未能成功

控制器:

@PostMapping("/purchaseToner/{tid}/{bid}")
    public String buyToner(Model model, @PathVariable("tid") Long tid,
                           @PathVariable("bid") Long bid){


        //Grab info
        Buyer mBuyer = buyerService.findOne(bid);
        Toner mToner = tonerService.findOneToner(tid);

        //Updating qualities
        mToner.setTonerQuantity(mToner.getTonerQuantity() - 1);
        mBuyer.setBalance(mBuyer.getBalance() - mToner.getTonerPrice());

        Buyer iBuyer = new Buyer();
        iBuyer.getToners().add(mToner);

        return "redirect:/";
    }
视图:


将th:action更改为following

<form th:action="@{/purchaseToner/{tid}/{bid}(tid=${toner.id},bid=${buyer.buyerId})}" th:object="${buyer}" method="post">


此外,您还需要为spring型号添加碳粉。在您的代码中,它不在模型中

您的apibuyToner没有接收路径变量作为数字的输入。您的api服务没有问题;检查您的客户端代码,它是否以正确的格式发送请求您是否使用任何restclient测试了您的api

查看java异常

java.lang.NumberFormatException: For input string: "{tid}(tid=${toner.id})"

这里的输入不是数字。为什么呢?

试着改变这一点:

@PostMapping("/purchaseToner/{tid}/{bid}")
    public String buyToner(Model model, @PathVariable("tid") Long tid,
                           @PathVariable("bid") Long bid){
...
    }
@PostMapping("/purchaseToner/{tid}/{bid}")
    public String buyToner(Model model, @PathVariable("tid") String tid,
                           @PathVariable("bid") String bid){

        long bidlong = Long.parseLong(bid)
        long tidlong = Long.parseLong(tid)

        //Grab info
        Buyer mBuyer = buyerService.findOne(bid);
        Toner mToner = tonerService.findOneToner(tid);

        ...
    }
进入这个:

@PostMapping("/purchaseToner/{tid}/{bid}")
    public String buyToner(Model model, @PathVariable("tid") Long tid,
                           @PathVariable("bid") Long bid){
...
    }
@PostMapping("/purchaseToner/{tid}/{bid}")
    public String buyToner(Model model, @PathVariable("tid") String tid,
                           @PathVariable("bid") String bid){

        long bidlong = Long.parseLong(bid)
        long tidlong = Long.parseLong(tid)

        //Grab info
        Buyer mBuyer = buyerService.findOne(bid);
        Toner mToner = tonerService.findOneToner(tid);

        ...
    }

换句话说,将控制器的参数更改为字符串类型,然后将其转换为Long。

能否在控制器中运行此代码并重试<代码>@PostMapping(“/purchaseToner/{tid}/{bid}”)公共字符串buytone(模型模型,@PathVariable(“tid”)字符串tid,@PathVariable(“bid”)字符串bid){Long extractedId=Long.valueOf(tid).longValue();Long extractedBid=Long.valueOf(bid).longValue();//Grab info Buyer mBuyer=buyerService.findOne(extractedBid);Toner mToner=tonerService.findOneToner(extractedId);}为什么要添加两个对象?Toner对象可以添加为模型属性,同时将“buyer”保留为表单对象您在thymleaf模板中的url有缺陷。您应该首先定义属性,然后替换它们。类似于
@{/purchaseToner/{tid}/{bid}(tid=${toner.id},bid=${buyer.buyerId})的东西应该可以做到这一点。有关更多信息,请参阅Thymeleaf。一个小的更正。
buyer-mBuyer=buyerService.findOne(mBuyer);toner-mToner=tonerService.findOneToner(mToner);
not
buyer-mBuyer=buyerService.findOne(投标);Toner mToner=tonerService.findOneToner(tid);