【问题标题】:@RequestBody null values (Spring boot and Vue JS)@RequestBody 空值(Spring boot 和 Vue JS)
【发布时间】:2018-10-07 09:07:00
【问题描述】:

大家好(第一次发帖!)

我正在开发一个简单的 Web 应用程序时遇到问题。

我使用 Spring Boot 创建了一个休息服务 (POST),但是当我从前端尝试此服务时,我无法在我的 @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();
}

}

请注意,shoppingCart 在 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 控制器配合得很好

【问题讨论】:

    标签: javascript java spring-boot model-view-controller controller


    【解决方案1】:

    只是为了提供更新。我找到了解决方法。

    我不会直接使用 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
            }))
    

    这按预期工作

    【讨论】:

      【解决方案2】:

      这是一篇旧帖子,但此信息可能会对某人有所帮助。它在顶部使用@RequestBody 完成并映射到模型的方式应该使用@RestController,除了响应不应该是字符串而可能是具有更新值的模型的小例外。

      就我而言,我遇到了一个问题,即 @RequestBody 错误地从 SwaggerUI 导入,而不是“ import org.springframework.web.bind.annotation.RequestBody;" 这让我很难捕捉到错误。

      只要 pojo 是可序列化的,它就应该可以工作。此外,如果您从手动构建的字符串发送 JSON,请确保在属性的大小写上遵循命名约定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多