大家好(这里的第一篇文章!(
我有一个简单的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始终是无效的。我想念什么吗?这似乎是一件基本的事情,并且与我在
只是为了更新。我对此找到了解决方法。
而不是直接使用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,请确保在属性的外壳上遵循命名约定。