Нулевые значения @RequestBody (Spring boot и Vue JS) - PullRequest
0 голосов
/ 26 апреля 2018

Привет всем (первый пост здесь!)

У меня проблема с простым веб-приложением, которое я разрабатываю.

Я создал службу отдыха (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, который я делал до

1 Ответ

0 голосов
/ 13 мая 2018

Просто чтобы дать обновление. Я нашел решение этой проблемы.

Вместо непосредственного использования объекта 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
        }))

Это работает как ожидалось

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...