可选的长参数'id'存在但不能转换为空值

时间:2014-08-10 23:16:38

标签: java spring

我的Spring控制器中有两种方法:

    @RequestMapping(method = RequestMethod.GET, value = CARD_PATH)
    public @ResponseBody List<BaseballCard> getAllCards()

    @RequestMapping(method = RequestMethod.GET, value = CARD_PATH + "/{id}")
    public BaseballCard getCard(@PathVariable("id") long id)

发出GET /bbct/api/v1.0/card/1的HTTP请求时出现以下错误。

  

可选长参数'id'存在但由于被声明为基本类型而无法转换为空值。

建议将id声明为Long;但是,我宁愿不这样做。

我想知道为什么Spring认为id参数是可选的?由于我有另一个方法在id丢失时处理请求,因此如果请求被分派到getCard(),则肯定会提供id。

这是完整的控制器:

@Controller
public class BaseballCardController {

    private static final String CARD_PATH = "/bbct/api/v1.0/card";

    private List<BaseballCard> cards = new ArrayList<BaseballCard>();

    @RequestMapping(method = RequestMethod.POST, value = CARD_PATH)
    public @ResponseBody
    BaseballCard addCard(@RequestBody BaseballCard card) {
        cards.add(card);
        card.setId(cards.size());
        return card;
    }

    @RequestMapping(method = RequestMethod.GET, value = CARD_PATH)
    public @ResponseBody List<BaseballCard> getAllCards() {
        return cards;
    }

    @RequestMapping(method = RequestMethod.GET, value = CARD_PATH + "/{id}")
    public BaseballCard getCard(@PathVariable("id") long id) {
        return cards.get((int)(id - 1));
    }

}

1 个答案:

答案 0 :(得分:0)

我认为发生的事情是你(无意中?)向/bbct/api/v1.0/card/提出请求(注意结尾处的尾部斜线)并将其映射到getCard()而不是getAllCards() < / p>

将ID转换为Long并在required = false上设置@PathVariable("id")属性,然后重定向到getAllCards()可能是个好主意。通过这种方式,您可以映射getAllCards()的斜杠后缀和非斜杠后缀版本