@RequestBody null values (Spring boot and Vue JS)



大家好(这里的第一篇文章!(

我有一个简单的Web应用程序的问题。

我使用Spring Boot创建了一个REST服务(帖子(,但是当我从前端尝试此服务时,我无法在@requestbody上检索任何值。

调用控制器的JavaScript为以下

bookstore.html

                //Submit shopping cart to the backend to be saved
            checkout : function() {
                //Place holder for the POST Request
                this.$http.post('/createOrder', {
                    'shopCart' : {'basket' : this.shoppingCart}
                });
                //END Post request
            }

ordercontroller.java

    @RequestMapping(value = "/createOrder",
        method = RequestMethod.POST)
public String createOrder(@RequestBody ShoppingCart shopCart, Model model) {
    Order order = new Order();
    Float totalPrice = 0f;
    order.setCreationDate(new Date());
    List<String> bookIdList = new ArrayList<>();
    for (Book book : shopCart.getBasket()) {
        bookIdList.add(book.getId());
        totalPrice = totalPrice + book.getPrice();
    }
    order.setItemList(bookIdList);
    order.setTotalOrder(totalPrice);
    orderRepo.save(order);
    List<Order> orderList = orderRepo.findAll();
    model.addAttribute("addedOrder", order);
    model.addAttribute("orderList", orderList);
    return "orderList";
}

shoppingcart.java

public class ShoppingCart {
private List<Book> basket;
public List<Book> getBasket() {
    return basket;
}
public void setBasket(List<Book> basket) {
    this.basket = basket;
}
@Override
public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("BookList [shoppingCart=");
    builder.append(basket);
    builder.append("]");
    return builder.toString();
}

}

请注意,购物车被定义为VUE JS中的对象数组。当我设置此值时,看起来像这样

{"shoppingCart":[{"id":"5add48ed217c1823543f0610","name":"War and Peace","author":"Leo Tolstoy","price":25},{"id":"5add48ed217c1823543f060f","name":"Madame Bovary","author":"Gustave Flaubert","price":20}]}

问题是Shopcart始终是无效的。我想念什么吗?这似乎是一件基本的事情,并且与我在

之前所做的RequestParam Controller一起工作正常

只是为了更新。我对此找到了解决方法。

而不是直接使用shoppingcart对象,我会将JSON字符串传递到变量并使用ObjectMapper创建我的对象。

    @RequestMapping(path = "/createOrderList", method = RequestMethod.POST)
public String createOrderList(@RequestBody String shopCart, Model model)
        throws JsonParseException, JsonMappingException, IOException {
    Order order = new Order();
    Float totalPrice = 0f;
    order.setCreationDate(new Date());
    List<String> bookIdList = new ArrayList<>();
    ObjectMapper mapper = new ObjectMapper();
    ShoppingCart shpCart = mapper.readValue(shopCart, ShoppingCart.class);
    for (Book book : shpCart.getBookList()) {
        bookIdList.add(book.getId());
        totalPrice = totalPrice + book.getPrice();
    }
    order.setItemList(bookIdList);
    order.setTotalOrder(totalPrice);
    orderRepo.save(order);
    model.addAttribute("orderList", orderRepo.findAll());
    model.addAttribute("bookList", bookRepo.findAll());
    model.addAttribute("addedOrder", order);
    return "bookStore";
}

在前面的端端,JavaScript看起来像

this.$http.post('/createOrderList', JSON.stringify({
            'bookList': this.shoppingCart
        }))

这是按预期工作

这是一个旧文章,但是此信息可能会对某人有所帮助。用@requestbody和映射到模型的顶部完成的方式应与@RestController一起使用,而小例外,响应不应该是字符串,而是具有更新值的模型。

就我而言,我遇到了一个问题,即从Swaggerui而不是quot进口@requestbody。导入org.springframework.web.bind.annotation.requestbody;这让我很难捕获错误。

只要POJO是可序列化的,就应该有效。此外,如果您是从手动构建的字符串发送JSON,请确保在属性的外壳上遵循命名约定。

最新更新