我正在使用Spring-MVC开发一个电子商务网站,我正在创建购物车。我正在查找URL tradingcards / rest / cart / add / P1并收到错误"请求方法' GET'不支持"即使是方法," addItem()"映射到该URL的是PUT方法。
我知道这需要看很多代码,但我非常感谢提供的任何帮助
CartRestController.java
package com.tradingcards.tradingcards.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import com.tradingcards.tradingcards.domain.Cart;
import com.tradingcards.tradingcards.domain.CartItem;
import com.tradingcards.tradingcards.domain.Product;
import com.tradingcards.tradingcards.exception.CardNotFoundException;
import com.tradingcards.tradingcards.service.CartService;
import com.tradingcards.tradingcards.service.ProductService;
@Controller
@RequestMapping(value = "rest/cart")
public class CartRestController {
@Autowired
private CartService cartService;
@Autowired
private ProductService productService;
@RequestMapping(method = RequestMethod.POST)
public @ResponseBody Cart create(@RequestBody Cart cart) {
return cartService.create(cart);
}
@RequestMapping(value = "/{cartId}", method = RequestMethod.GET)
public @ResponseBody Cart read(@PathVariable(value = "cartId") String cartId) {
return cartService.read(cartId);
}
@RequestMapping(value = "/{cartId}", method = RequestMethod.PUT)
@ResponseStatus(value = HttpStatus.NO_CONTENT)
public void update(@PathVariable(value = "cartId") String cartId, @RequestBody Cart cart) {
cartService.update(cartId, cart);
}
@RequestMapping(value = "/{cartId}", method = RequestMethod.DELETE)
@ResponseStatus(value = HttpStatus.NO_CONTENT)
public void delete(@PathVariable(value = "cartId") String cartId) {
cartService.delete(cartId);
}
@RequestMapping(value = "/add/{productID}", method = RequestMethod.PUT)
@ResponseStatus(value = HttpStatus.NO_CONTENT)
public void addItem(@PathVariable String productID, HttpServletRequest request) {
String sessionId = request.getSession(true).getId();
Cart cart = cartService.read(sessionId);
if(cart== null) {
cart = cartService.create(new Cart(sessionId));
}
Product product = productService.getProductById(productID);
if(product == null) {
throw new IllegalArgumentException(new CardNotFoundException(productID));
}
cart.addCartItem(new CartItem(product));
cartService.update(sessionId, cart);
}
@RequestMapping(value = "/remove/{productID}", method = RequestMethod.PUT)
@ResponseStatus(value = HttpStatus.NO_CONTENT)
public void removeItem(@PathVariable String productID, HttpServletRequest request) {
String sessionId = request.getSession(true).getId();
Cart cart = cartService.read(sessionId);
if(cart== null) {
cart = cartService.create(new Cart(sessionId));
}
Product product = productService.getProductById(productID);
if(product == null) {
throw new IllegalArgumentException(new CardNotFoundException(productID));
}
cart.removeCartItem(new CartItem(product));
cartService.update(sessionId, cart);
}
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(value = HttpStatus.BAD_REQUEST, reason="Illegal request, please verify your payload")
public void handleClientErrors(Exception ex) { }
@ExceptionHandler(Exception.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR, reason="Internal server error")
public void handleServerErrors(Exception ex) { }
}
CartItem.java
package com.tradingcards.tradingcards.domain;
import java.io.Serializable;
import java.math.BigDecimal;
public class CartItem implements Serializable{
/**
*
*/
private static final long serialVersionUID = 3285341151884777001L;
private Product product;
private int quantity;
private BigDecimal totalPrice;
public CartItem() {
// TODO Auto-generated constructor stub
}
public CartItem(Product product) {
super();
this.product = product;
this.quantity = 1;
this.totalPrice = product.getUnitPrice();
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
this.updateTotalPrice();
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
this.updateTotalPrice();
}
public BigDecimal getTotalPrice() {
return totalPrice;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
public void updateTotalPrice() {
totalPrice = this.product.getUnitPrice().multiply(new BigDecimal(this.quantity));
}
@Override
public int hashCode() {
final int prime = 311;
int result = 1;
result = prime * result + ((product == null) ? 0 : product.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CartItem other = (CartItem) obj;
if (product == null) {
if (other.product != null)
return false;
} else if (!product.equals(other.product))
return false;
return true;
}
}
Cart.java
package com.tradingcards.tradingcards.domain;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
public class Cart implements Serializable{
private static final long serialVersionUID = 3286257236940240478L;
private String cartId;
private Map<String,CartItem> cartItems;
private BigDecimal grandTotal;
public Cart() {
cartItems = new HashMap<String, CartItem>();
grandTotal = new BigDecimal(0);
}
public Cart(String cartId) {
this();
this.cartId = cartId;
}
public String getCartId() {
return cartId;
}
public void setCartId(String cartId) {
this.cartId = cartId;
}
public Map<String, CartItem> getCartItems() {
return cartItems;
}
public void setCartItems(Map<String, CartItem> cartItems) {
this.cartItems = cartItems;
}
public BigDecimal getGrandTotal() {
return grandTotal;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
public void addCartItem(CartItem item) {
String productID = item.getProduct().getProductID();
if(cartItems.containsKey(productID)) {
CartItem existingCartItem = cartItems.get(productID);
existingCartItem.setQuantity(existingCartItem.getQuantity()+ item.getQuantity());
cartItems.put(productID, existingCartItem);
} else {
cartItems.put(productID, item);
}
updateGrandTotal();
}
public void removeCartItem(CartItem item) {
String productID = item.getProduct().getProductID();
cartItems.remove(productID);
updateGrandTotal();
}
public void updateGrandTotal() {
grandTotal= new BigDecimal(0);
for(CartItem item : cartItems.values()){
grandTotal = grandTotal.add(item.getTotalPrice());
}
}
@Override
public int hashCode() {
final int prime = 71;
int result = 1;
result = prime * result + ((cartId == null) ? 0 : cartId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Cart other = (Cart) obj;
if (cartId == null) {
if (other.cartId != null)
return false;
} else if (!cartId.equals(other.cartId))
return false;
return true;
}
}
CartRepository.java
package com.tradingcards.tradingcards.domain.repository;
import com.tradingcards.tradingcards.domain.Cart;
public interface CartRepository {
Cart create(Cart cart);
Cart read(String cartId);
void update(String cartId, Cart cart);
void delete(String cartID);
}
InMemoryCartRepository.java
package com.tradingcards.tradingcards.domain.repository.impl;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.tradingcards.tradingcards.domain.Cart;
import com.tradingcards.tradingcards.domain.repository.CartRepository;
@Repository
public class InMemoryCartRepository implements CartRepository {
private Map<String, Cart> listOfCarts;
public InMemoryCartRepository() {
listOfCarts = new HashMap<String,Cart>();
}
public Cart create(Cart cart) {
if(listOfCarts.keySet().contains(cart.getCartId())) {
throw new IllegalArgumentException(String.format("Can not create a cart. A cart with the give id (%) aldrady exist",cart.getCartId()));
}
listOfCarts.put(cart.getCartId(), cart);
return cart;
}
public Cart read(String cartId) {
return listOfCarts.get(cartId);
}
public void update(String cartId, Cart cart) {
if(!listOfCarts.keySet().contains(cartId)) {
throw new IllegalArgumentException(String.format("Can not update cart. The cart with the give id (%) does not does not exist",cartId));
}
listOfCarts.put(cartId, cart);
}
public void delete(String cartId) {
if(!listOfCarts.keySet().contains(cartId)) {
throw new IllegalArgumentException(String.format("Can not delete cart. The cart with the give id (%) does not does not exist",cartId));
}
listOfCarts.remove(cartId);
}
}
CartService.java
package com.tradingcards.tradingcards.service;
import com.tradingcards.tradingcards.domain.Cart;
public interface CartService {
Cart create(Cart cart);
Cart read(String cartId);
void update(String cartId, Cart cart);
void delete(String cartId);
Cart validate(String cartId);
}
CartServiceImpl
package com.tradingcards.tradingcards.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.tradingcards.tradingcards.domain.Cart;
import com.tradingcards.tradingcards.domain.repository.CartRepository;
import com.tradingcards.tradingcards.exception.InvalidCartException;
import com.tradingcards.tradingcards.service.CartService;
@Service
public class CartServiceImpl implements CartService{
@Autowired
private CartRepository cartRepository;
public Cart create(Cart cart) {
return cartRepository.create(cart);
}
public Cart read(String cartId) {
return cartRepository.read(cartId);
}
public void update(String cartId, Cart cart) {
cartRepository.update(cartId, cart);
}
public void delete(String cartId) {
cartRepository.delete(cartId);
}
public Cart validate(String cartId){
Cart cart = cartRepository.read(cartId);
if(cart==null || cart.getCartItems().size()==0){
throw new InvalidCartException(cartId);
}
return cart;
}
}
编辑:
controllers.js
var cartApp = angular.module('cartApp', []);
cartApp.controller('cartCtrl', function ($scope, $http) {
$scope.refreshCart = function(cartId) {
$http.get('/tradingcards/rest/cart/'+$scope.cartId).success(function(data) {
$scope.cart = data;
});
};
$scope.clearCart = function() {
$http['delete']('/tradingcards/rest/cart/'+$scope.cartId)
.success($scope.refreshCart($scope.cartId));
};
$scope.initCartId = function(cartId) {
$scope.cartId=cartId;
$scope.refreshCart($scope.cartId);
};
$scope.addToCart = function(productID) {
$http.put('/tradingcards/rest/cart/add/'+productID).success(function(data) {
$scope.refreshCart($http.get('/tradingcards/rest/cart/get/cartId'));
alert("Product Successfully added to the Cart!");
});
};
$scope.removeFromCart = function(productID) {
$http.put('/tradingcards/rest/cart/remove/'+productID).success(function(data) {
$scope.refreshCart($http.get('/tradingcards/rest/cart/get/cartId'));
});
};
});
答案 0 :(得分:0)
我在评论中添加了此内容,但在您完成广告后,我担心(就像其他评论者一样)在您的客户中发出此调用:
$http.get('/webstore/rest/cart/get/cartId')
我在控制器中看不到此调用的有效映射:
@RequestMapping(method = RequestMethod.POST)
@RequestMapping(value = "/{cartId}", method = RequestMethod.GET)
@RequestMapping(value = "/{cartId}", method = RequestMethod.PUT)
@RequestMapping(value = "/{cartId}", method = RequestMethod.DELETE)
@RequestMapping(value = "/add/{productID}", method = RequestMethod.PUT)
@RequestMapping(value = "/remove/{productID}", method = RequestMethod.PUT)
我会尝试评论这个电话,看看会发生什么。
您打算致电/webstore/rest/cart/cartId
吗? (即没有/get
)