1. 程式人生 > >Spring boot API測試 Controller邏輯正常但返回404

Spring boot API測試 Controller邏輯正常但返回404

  使用postman測試介面,返回404錯誤,如下所示

{
    "timestamp": 1516711514877,
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/sell/buyer/order/create"
}

檢視Controller層,並列印ResultVOUtil.success程式碼如下

<textarea readonly="readonly" name="code" class="Java"> 
@PostMapping("/create")
public ResultVO create(@Valid OrderForm orderForm, BindingResult bindingResult){
if (bindingResult.hasErrors()) {
log.error("【建立訂單】引數不正確,OrderForm={}",orderForm);
throw new SellException(ResultEnum.PARAM_ERROR.getCode(),
bindingResult.getFieldError().getDefaultMessage());
}
OrderDTO orderDTO = OrderForm2OrderDTO.convert(orderForm);
if (CollectionUtils.isEmpty(orderDTO.getOrderDetails()) ) {
log.error("【建立訂單】購物車不能為空");
throw new SellException(ResultEnum.CART_IS_EMPTY);
}
/**
* 資料庫儲存 訂單資訊
*/
OrderDTO creatResult=orderService.creat(orderDTO);
/** 拼接返回資料*/
Map<String,String> map = new HashMap<>();
map.put("orderId",creatResult.getOrderId());
System.out.println(ResultVOUtil.success(map));
return ResultVOUtil.success(map);

列印ResultVOUtil.success(map)顯示內容如下
ResultVO(code=0, msg=success, data={orderId=1516711514688210126})
那就奇怪了,在return該物件時候,API測試就提示404了。後來發現註解如下 用的是@Controller註解
@Controller
@Slf4j
@RequestMapping("/buyer/order")
將Controller改為RestConntroller問題成功解決!

附:@Controller和@RestConntroller區別

@RestController is a stereotype annotation that combines @ResponseBody and @Controller.
意思是:
@RestController註解相當於@ResponseBody + @Controller合在一起的作用。

1)如果只是使用@RestController註解Controller,則Controller中的方法無法返回jsp頁面,配置的檢視解析器InternalResourceViewResolver不起作用,返回的內容就是Return 裡的內容。

例如:本來應該到success.jsp頁面的,則其顯示success.

2)如果需要返回到指定頁面,則需要用 @Controller配合檢視解析器InternalResourceViewResolver才行。
3)如果需要返回JSON,XML或自定義mediaType內容到頁面,則需要在對應的方法上加上@ResponseBody註解。