国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

這是我見過寫的最優(yōu)雅的Controller 層代碼!

共 28069字,需瀏覽 57分鐘

 ·

2022-06-29 16:26


點擊上方“Java技術江湖”,選擇“設為星標

回復”666“獲取全網最熱的Java核心知識點整理


目錄
  • 前言

  • Controller 層參數接收

  • 統(tǒng)一狀態(tài)碼

  • 統(tǒng)一校驗

  • 統(tǒng)一響應

  • 統(tǒng)一異常


前言


本篇主要要介紹的就是 controller 層的處理,一個完整的后端請求由 4 部分組成:

  • 接口地址(也就是 URL 地址)

  • 請求方式(一般就是 get、set,當然還有 put、delete)

  • 請求數據(request,有 head 跟 body)

  • 響應數據(response)


本篇將解決以下 3 個問題:

  • 當接收到請求時,如何優(yōu)雅的校驗參數
  • 返回響應數據該如何統(tǒng)一的進行處理
  • 接收到請求,處理業(yè)務邏輯時拋出了異常又該如何處理


Controller 層參數接收(太基礎了,可以跳過)


常見的請求就分為 get 跟 post 兩種:
@RestController
@RequestMapping("/product/product-info")
public class ProductInfoController {

    @Autowired
    ProductInfoService productInfoService;

    @GetMapping("/findById")
    public ProductInfoQueryVo findById(Integer id) {
        ...
    }

    @PostMapping("/page")
    public IPage findPage(Page page, ProductInfoQueryVo vo) {
        ...
    }
}


RestController:之前解釋過,@RestController=@Controller+ResponseBody。


加上這個注解,springboot 就會吧這個類當成 controller 進行處理,然后把所有返回的參數放到 ResponseBody 中。


@RequestMapping:請求的前綴,也就是所有該 Controller 下的請求都需要加上 /product/product-info 的前綴。


@GetMapping("/findById"):標志這是一個 get 請求,并且需要通過 /findById 地址才可以訪問到。


@PostMapping("/page"):同理,表示是個 post 請求。


參數:至于參數部分,只需要寫上 ProductInfoQueryVo,前端過來的 json 請求便會通過映射賦值到對應的對象中,例如請求這么寫,productId 就會自動被映射到 vo 對應的屬性當中。
size : 1
current : 1

productId : 1
productName : 泡腳


統(tǒng)一狀態(tài)碼


| 返回格式

為了跟前端妹妹打好關系,我們通常需要對后端返回的數據進行包裝一下,增加一下狀態(tài)碼,狀態(tài)信息,這樣前端妹妹接收到數據就可以根據不同的狀態(tài)碼,判斷響應數據狀態(tài),是否成功是否異常進行不同的顯示。


當然這讓你擁有了更多跟前端妹妹的交流機會,假設我們約定了 1000 就是成功的意思。


如果你不封裝,那么返回的數據是這樣子的:
{
  "productId"1,
  "productName""泡腳",
  "productPrice"100.00,
  "productDescription""中藥泡腳加按摩",
  "productStatus"0,
}


經過封裝以后時這樣子的:
{
  "code"1000,
  "msg""請求成功",
  "data": {
    "productId"1,
    "productName""泡腳",
    "productPrice"100.00,
    "productDescription""中藥泡腳加按摩",
    "productStatus"0,
  }
}


| 封裝 ResultVo

這些狀態(tài)碼肯定都是要預先編好的,怎么編呢?寫個常量 1000?還是直接寫死 1000?


要這么寫就真的書白讀的了,寫狀態(tài)碼當然是用枚舉拉:


首先先定義一個狀態(tài)碼的接口,所有狀態(tài)碼都需要實現它,有了標準才好做事:
public interface StatusCode {
    public int getCode();
    public String getMsg();
}


然后去找前端妹妹,跟他約定好狀態(tài)碼(這可能是你們唯一的約定了)枚舉類嘛,當然不能有 setter 方法了,因此我們不能在用 @Data 注解了,我們要用 @Getter。
@Getter
public enum ResultCode implements StatusCode{
    SUCCESS(1000"請求成功"),
    FAILED(1001"請求失敗"),
    VALIDATE_ERROR(1002"參數校驗失敗"),
    RESPONSE_PACK_ERROR(1003"response返回包裝失敗");

    private int code;
    private String msg;

    ResultCode(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}


寫好枚舉類,就開始寫 ResultVo 包裝類了,我們預設了幾種默認的方法,比如成功的話就默認傳入 object 就可以了,我們自動包裝成 success。
@Data
public class ResultVo {
    // 狀態(tài)碼
    private int code;

    // 狀態(tài)信息
    private String msg;

    // 返回對象
    private Object data;

    // 手動設置返回vo
    public ResultVo(int code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    // 默認返回成功狀態(tài)碼,數據對象
    public ResultVo(Object data) {
        this.code = ResultCode.SUCCESS.getCode();
        this.msg = ResultCode.SUCCESS.getMsg();
        this.data = data;
    }

    // 返回指定狀態(tài)碼,數據對象
    public ResultVo(StatusCode statusCode, Object data) {
        this.code = statusCode.getCode();
        this.msg = statusCode.getMsg();
        this.data = data;
    }

    // 只返回狀態(tài)碼
    public ResultVo(StatusCode statusCode) {
        this.code = statusCode.getCode();
        this.msg = statusCode.getMsg();
        this.data = null;
    }
}


使用,現在的返回肯定就不是 return data;這么簡單了,而是需要 new ResultVo(data);
    @PostMapping("/findByVo")
    public ResultVo findByVo(@Validated ProductInfoVo vo) {
        ProductInfo productInfo = new ProductInfo();
        BeanUtils.copyProperties(vo, productInfo);
        return new ResultVo(productInfoService.getOne(new QueryWrapper(productInfo)));
    }


最后返回就會是上面帶了狀態(tài)碼的數據了。


統(tǒng)一校驗


| 原始做法

假設有一個添加 ProductInfo 的接口,在沒有統(tǒng)一校驗時,我們需要這么做。
@Data
public class ProductInfoVo {
    // 商品名稱
    private String productName;
    // 商品價格
    private BigDecimal productPrice;
    // 上架狀態(tài)
    private Integer productStatus;
}


    @PostMapping("/findByVo")
    public ProductInfo findByVo(ProductInfoVo vo) {
        if (StringUtils.isNotBlank(vo.getProductName())) {
            throw new APIException("商品名稱不能為空");
        }
        if (null != vo.getProductPrice() && vo.getProductPrice().compareTo(new BigDecimal(0)) < 0) {
            throw new APIException("商品價格不能為負數");
        }
        ...

        ProductInfo productInfo = new ProductInfo();
        BeanUtils.copyProperties(vo, productInfo);
        return new ResultVo(productInfoService.getOne(new QueryWrapper(productInfo)));
    }


這 if 寫的人都傻了,能忍嗎?肯定不能忍啊。


| @Validated 參數校驗

好在有 @Validated,又是一個校驗參數必備良藥了。有了 @Validated 我們只需要再 vo 上面加一點小小的注解,便可以完成校驗功能。
@Data
public class ProductInfoVo {
    @NotNull(message = "商品名稱不允許為空")
    private String productName;

    @Min(value = 0, message = "商品價格不允許為負數")
    private BigDecimal productPrice;

    private Integer productStatus;
}


    @PostMapping("/findByVo")
    public ProductInfo findByVo(@Validated ProductInfoVo vo) {
        ProductInfo productInfo = new ProductInfo();
        BeanUtils.copyProperties(vo, productInfo);
        return new ResultVo(productInfoService.getOne(new QueryWrapper(productInfo)));
    }


運行看看,如果參數不對會發(fā)生什么?


我們故意傳一個價格為 -1 的參數過去:

productName : 泡腳
productPrice : -1
productStatus : 1


{
  "timestamp""2020-04-19T03:06:37.268+0000",
  "status"400,
  "error""Bad Request",
  "errors": [
    {
      "codes": [
        "Min.productInfoVo.productPrice",
        "Min.productPrice",
        "Min.java.math.BigDecimal",
        "Min"
      ],
      "arguments": [
        {
          "codes": [
            "productInfoVo.productPrice",
            "productPrice"
          ],
          "defaultMessage""productPrice",
          "code""productPrice"
        },
        0
      ],
      "defaultMessage""商品價格不允許為負數",
      "objectName""productInfoVo",
      "field""productPrice",
      "rejectedValue"-1,
      "bindingFailure"false,
      "code""Min"
    }
  ],
  "message""Validation failed for object\u003d\u0027productInfoVo\u0027. Error count: 1",
  "trace""org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors\nField error in object \u0027productInfoVo\u0027 on field \u0027productPrice\u0027: rejected value [-1]; codes [Min.productInfoVo.productPrice,Min.productPrice,Min.java.math.BigDecimal,Min]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [productInfoVo.productPrice,productPrice]; arguments []; default message [productPrice],0]; default message [商品價格不允許為負數]\n\tat org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:164)\n\tat org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)\n\tat org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167)\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:660)\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:741)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594)\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n\tat java.base/java.lang.Thread.run(Thread.java:830)\n",
  "path""/leilema/product/product-info/findByVo"
}


大功告成了嗎?雖然成功校驗了參數,也返回了異常,并且?guī)?商品價格不允許為負數"的信息。


但是你要是這樣返回給前端,前端妹妹就提刀過來了,當年約定好的狀態(tài)碼,你個負心人說忘就忘?


用戶體驗小于等于 0 啊!所以我們要進行優(yōu)化一下,每次出現異常的時候,自動把狀態(tài)碼寫好,不負妹妹之約!


| 優(yōu)化異常處理

首先我們先看看校驗參數拋出了什么異常:
Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors


我們看到代碼拋出了 org.springframework.validation.BindException 的綁定異常,因此我們的思路就是 AOP 攔截所有 controller,然后異常的時候統(tǒng)一攔截起來,進行封裝!完美!

玩你個頭啊完美,這么呆瓜的操作 springboot 不知道嗎?spring mvc 當然知道拉,所以給我們提供了一個 @RestControllerAdvice 來增強所有 @RestController,然后使用 @ExceptionHandler 注解,就可以攔截到對應的異常。


這里我們就攔截 BindException.class 就好了。最后在返回之前,我們對異常信息進行包裝一下,包裝成 ResultVo,當然要跟上 ResultCode.VALIDATE_ERROR 的異常狀態(tài)碼。


這樣前端妹妹看到 VALIDATE_ERROR 的狀態(tài)碼,就會調用數據校驗異常的彈窗提示用戶哪里沒填好。
@RestControllerAdvice
public class ControllerExceptionAdvice {

    @ExceptionHandler({BindException.class})
    public ResultVo MethodArgumentNotValidExceptionHandler(BindException e) {
        // 從異常對象中拿到ObjectError對象
        ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
        return new ResultVo(ResultCode.VALIDATE_ERROR, objectError.getDefaultMessage());
    }
}


來看看效果,完美。1002 與前端妹妹約定好的狀態(tài)碼:
{
  "code"1002,
  "msg""參數校驗失敗",
  "data""商品價格不允許為負數"
}


統(tǒng)一響應


| 統(tǒng)一包裝響應

再回頭看一下 controller 層的返回:
return new ResultVo(productInfoService.getOne(new QueryWrapper(productInfo)));


開發(fā)小哥肯定不樂意了,誰有空天天寫 new ResultVo(data) 啊,我就想返回一個實體!怎么實現我不管!


好把,那就是 AOP 攔截所有 Controller,再 @After 的時候統(tǒng)一幫你封裝一下咯。
怕是上一次臉打的不夠疼,springboot 能不知道這么個操作嗎?
@RestControllerAdvice(basePackages = {"com.bugpool.leilema"})
public class ControllerResponseAdvice implements ResponseBodyAdvice<Object{
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass{
        // response是ResultVo類型,或者注釋了NotControllerResponseAdvice都不進行包裝
        return !methodParameter.getParameterType().isAssignableFrom(ResultVo.class);
    }

    @Override
    public Object beforeBodyWrite(Object data, MethodParameter returnType, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClassServerHttpRequest requestServerHttpResponse response{
        // String類型不能直接包裝
        if (returnType.getGenericParameterType().equals(String.class)) {
            ObjectMapper objectMapper = new ObjectMapper();
            try {
                // 將數據包裝在ResultVo里后轉換為json串進行返回
                return objectMapper.writeValueAsString(new ResultVo(data));
            } catch (JsonProcessingException e) {
                throw new APIException(ResultCode.RESPONSE_PACK_ERROR, e.getMessage());
            }
        }
        // 否則直接包裝成ResultVo返回
        return new ResultVo(data);
    }
}


①@RestControllerAdvice(basePackages = {"com.bugpool.leilema"}) 自動掃描了所有指定包下的 controller,在 Response 時進行統(tǒng)一處理。


②重寫 supports 方法,也就是說,當返回類型已經是 ResultVo 了,那就不需要封裝了,當不等與 ResultVo 時才進行調用 beforeBodyWrite 方法,跟過濾器的效果是一樣的。


③最后重寫我們的封裝方法 beforeBodyWrite,注意除了 String 的返回值有點特殊,無法直接封裝成 json,我們需要進行特殊處理,其他的直接 new ResultVo(data); 就 ok 了。


打完收工,看看效果:
    @PostMapping("/findByVo")
    public ProductInfo findByVo(@Validated ProductInfoVo vo) {
        ProductInfo productInfo = new ProductInfo();
        BeanUtils.copyProperties(vo, productInfo);
        return productInfoService.getOne(new QueryWrapper(productInfo));
    }


此時就算我們返回的是 po,接收到的返回就是標準格式了,開發(fā)小哥露出了欣慰的笑容。
{
  "code"1000,
  "msg""請求成功",
  "data": {
    "productId"1,
    "productName""泡腳",
    "productPrice"100.00,
    "productDescription""中藥泡腳加按摩",
    "productStatus"0,
    ...
  }
}


| NOT 統(tǒng)一響應

不開啟統(tǒng)一響應原因:開發(fā)小哥是開心了,可是其他系統(tǒng)就不開心了。舉個例子:我們項目中集成了一個健康檢測的功能,也就是這貨。

@RestController
public class HealthController {
    @GetMapping("/health")
    public String health() {
        return "success";
    }
}


公司部署了一套校驗所有系統(tǒng)存活狀態(tài)的工具,這工具就定時發(fā)送 get 請求給我們系統(tǒng):

“兄弟,你死了嗎?”
“我沒死,滾”
“兄弟,你死了嗎?”
“我沒死,滾”


是的,web 項目的本質就是復讀機。一旦發(fā)送的請求沒響應,就會給負責人發(fā)信息(企業(yè)微信或者短信之類的),你的系統(tǒng)死啦!趕緊回來排查 bug 吧!


讓大家感受一下。每次看到我都射射發(fā)抖,早上 6 點!我 tm?。。。?!
好吧,沒辦法,人家是老大,人家要的返回不是:
{
  "code"1000,
  "msg""請求成功",
  "data""success"
}


人家要的返回只要一個 success,人家定的標準不可能因為你一個系統(tǒng)改。俗話說的好,如果你改變不了環(huán)境,那你就只能我****


新增不進行封裝注解:因為百分之 99 的請求還是需要包裝的,只有個別不需要,寫在包裝的過濾器吧?又不是很好維護,那就加個注解好了。所有不需要包裝的就加上這個注解。

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotControllerResponseAdvice {
}


然后在我們的增強過濾方法上過濾包含這個注解的方法:
@RestControllerAdvice(basePackages = {"com.bugpool.leilema"})
public class ControllerResponseAdvice implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        // response是ResultVo類型,或者注釋了NotControllerResponseAdvice都不進行包裝
        return !(methodParameter.getParameterType().isAssignableFrom(ResultVo.class)
                || methodParameter.hasMethodAnnotation(NotControllerResponseAdvice.class));
    }
    ...


最后就在不需要包裝的方法上加上注解:
@RestController
public class HealthController {

    @GetMapping("/health")
    @NotControllerResponseAdvice
    public String health() {
        return "success";
    }
}


這時候就不會自動封裝了,而其他沒加注解的則依舊自動包裝:

統(tǒng)一異常


每個系統(tǒng)都會有自己的業(yè)務異常,比如庫存不能小于 0 子類的,這種異常并非程序異常,而是業(yè)務操作引發(fā)的異常,我們也需要進行規(guī)范的編排業(yè)務異常狀態(tài)碼,并且寫一個專門處理的異常類,最后通過剛剛學習過的異常攔截統(tǒng)一進行處理,以及打日志。


①異常狀態(tài)碼枚舉,既然是狀態(tài)碼,那就肯定要實現我們的標準接口 StatusCode。
@Getter
public enum  AppCode implements StatusCode {

    APP_ERROR(2000"業(yè)務異常"),
    PRICE_ERROR(2001"價格異常");

    private int code;
    private String msg;

    AppCode(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}


②異常類,這里需要強調一下,code 代表 AppCode 的異常狀態(tài)碼,也就是 2000;msg 代表業(yè)務異常,這只是一個大類,一般前端會放到彈窗 title 上;最后 super(message); 這才是拋出的詳細信息,在前端顯示在彈窗體中,在 ResultVo 則保存在 data 中。
@Getter
public class APIException extends RuntimeException {
    private int code;
    private String msg;

    // 手動設置異常
    public APIException(StatusCode statusCode, String message) {
        // message用于用戶設置拋出錯誤詳情,例如:當前價格-5,小于0
        super(message);
        // 狀態(tài)碼
        this.code = statusCode.getCode();
        // 狀態(tài)碼配套的msg
        this.msg = statusCode.getMsg();
    }

    // 默認異常使用APP_ERROR狀態(tài)碼
    public APIException(String message) {
        super(message);
        this.code = AppCode.APP_ERROR.getCode();
        this.msg = AppCode.APP_ERROR.getMsg();
    }

}


最后進行統(tǒng)一異常的攔截,這樣無論在 service 層還是 controller 層,開發(fā)人員只管拋出 API 異常,不需要關系怎么返回給前端,更不需要關心日志的打印。
@RestControllerAdvice
public class ControllerExceptionAdvice {

    @ExceptionHandler({BindException.class})
    public ResultVo MethodArgumentNotValidExceptionHandler(BindException e) {
        // 從異常對象中拿到ObjectError對象
        ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
        return new ResultVo(ResultCode.VALIDATE_ERROR, objectError.getDefaultMessage());
    }

    @ExceptionHandler(APIException.class)
    public ResultVo APIExceptionHandler(APIException e) {
        // log.error(e.getMessage(), e); 由于還沒集成日志框架,暫且放著,寫上TODO
        return new ResultVo(e.getCode(), e.getMsg(), e.getMessage());
    }
}


最后使用,我們的代碼只需要這么寫。
        if (null == orderMaster) {
            throw new APIException(AppCode.ORDER_NOT_EXIST, "訂單號不存在:" + orderId);
        }


{
  "code"2003,
  "msg""訂單不存在",
  "data""訂單號不存在:1998"
}


就會自動拋出 AppCode.ORDER_NOT_EXIST 狀態(tài)碼的響應,并且?guī)袭惓T敿毿畔⒂唵翁柌淮嬖冢簒xxx。

后端小哥開發(fā)有效率,前端妹妹獲取到 2003 狀態(tài)碼,調用對應警告彈窗,title 寫上訂單不存在,body 詳細信息記載"訂單號不存在:1998"。同時日志還自動打上去了。

來源:bugpool.blog.csdn.net/

article/details/105610962

我的朋友因為 JSON.stringify 差點丟了獎金


代碼注釋的藝術,優(yōu)秀代碼真的不需要注釋嗎?


有了HTTP,為什么還要RPC?


關注公眾號【Java技術江湖】后回復“PDF”即可領取200+頁的《Java工程師面試指南》

強烈推薦,幾乎涵蓋所有Java工程師必知必會的知識點,不管是復習還是面試,都很實用。



瀏覽 47
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 成人黄色网址| 国产三级性爱视频| 日韩性AV| 91青青草| 一区二区三区四区久久| caopor在线| 人人干天天干| 亚洲精品影视| 在线视频观看一区| 西西444WWW无码视频软件| adn日韩av| 在线视频91| 日韩无码一区二区三区四区| 成人av中文字幕| 7799综合| 欧美mv日韩mv国产| 色播视频在线观看| 18禁成人A∨片| 亚洲操逼无码| 午夜性爽视频男人的天堂| 神马午夜福利视频| 日本无码专区| 欧美第一区| 丁香婷婷五月色成人网站| 国产视频在线免费观看| a网站在线| 高圆圆一区二区三区| 天天操天天操天天操天天| 奶头和荫蒂添的好舒服囗交漫画| 巨乳国产一区| 插菊花综合| 亚洲成人性爱| 97超碰在线免费观看| 97狠狠| 国产小视频在线播放| 人人干天天操| 亚洲欧美久久久| 北条麻妃99精品青青久久| 色呦呦视频| 日韩av中文字幕在线播放| 国产亚洲视频在线观看视频| 性感欧美美女| 99免费视频| 天天干天天爽| 中文字幕无码av| 国产有码视频| 欧美午夜成人| 国产欧美日韩在线观看| 91丨熟女丨首页| 国产九九九九| 欧美日本国产| 东京热无码免费视频| 麻豆自拍偷拍| 亚州av| 美女掰穴| a片免费网站| 环亚无码| 亚洲无码精品一区| 少妇无码在线观看| 亚欧洲精品在线视频| 另类老妇性BBwBBw图片| 97成人在线视频| 日本一区二区在线视频| 五月婷婷成人| 91大吊| 黄色av网站免费| 中文字幕无码一区二区三区一本久 | 人人澡人人干| 91成人一区二区三区| 在线免费观看黄色片| 一级片欧美| 久久成人导航| 国产一级aa| 大香蕉网伊| 无码人妻中文字幕| 国产色哟哟| 久久久久免费| 男女视频网站| 日韩有码第一页| 草逼无码| 在线a视频| 爱搞在线观看| 91久久国产| 国产成人一区二区三区| AV麻豆| 国产精品内射婷婷一级二| 色播综合| 亚洲黄色成人网站| 精品蜜桃一区二区三区| 久久一区二区三区四区| 无码天堂| 老司机永久免费91| 亚洲国产精品久久久久婷婷老年| 激情五月天小说网| 91丨露脸丨熟女精品| 久久久国产一区二区三区| 老司机在线免费视频| 岛国av片| 欧美一级特黄A片免费观看| 色呦呦视频| 国产v亚洲| 成av人片一区二区三区久久| 欧美性爱XXXX黑人XYX性爽 | 看90后操B| 亚日韩视频| 欧美综合视频在线观看| 国产aaaaaaaaaaaaa| 怡红院成人在线| 色五月电影| 日韩日韩日韩日韩日韩| AV天堂资源| 91精品国产一区二区三区| 国产精品一区二区在线观看| 欧美日韩免费视频| 日韩黄色视频网站| 欧美一级黄色A片| 影音先锋二区| 黄网站免费看| 高清无码一区| 精品国产乱码久久久久夜深人妻 | 中文字字幕在线| 水果派解说av| 午夜九九九| 臭小子晚上让你爽个够视频| www.国产在线| 男女激情网站| 狠狠的操| 国产精品久久久久国产A级| 无码视频免费播放| 国产精品香蕉国产| 91在线无码精品在线看| 在线欧美亚洲| 三级片一区二区| www.污| 91Av视频| 影音先锋资源| 久久双飞| 欧美综合区| 亚洲AV成人片色在线观看高潮| 精品无码一区二区三区蜜桃李宗瑞| 国产乱伦中文字幕| 免费A片观看| 一级黄色电影在线观看| 日韩操逼网| 美国一级A片草草视频| 五月婷婷开心| 国产操逼网址| 99国产精品久久久久久久成人| 日韩无码内射| 91精品久久久久久粉嫩| 欧美大香蕉网| 日本成人视频在线免费播放| 亚洲无码一卡| 日韩日韩日韩日韩日韩| 翔田千里在线播放| 中文字幕在线日亚洲9| 成人小视频在线观看| 国产无码免费视频| 性爱精品视频| 9久精品| 国产中文自拍| 日本A在线观看| 久久久久99精品成人网站| 午夜精品无码| 一级色色片| 亲子乱AV一区二区| 一级二级三级毛片| 午夜老湿机| 日韩中文字幕在线视频| 人人肏人人摸| 久久丝袜| 大香蕉国产| 精品福利一区二区三区| 精品操逼视频| 中文字幕网站在线观看| 操久在线| 久久久精品久久久| 99久在线精品99re8热| 香蕉久久久| 九九r在线精品观看视频| 亚洲AV中文在线| 色777网站| 亚洲性天堂| 久操视频网| 日韩不卡| 国产精品免费一区二区三区四区视频 | 日韩一级电影在线| h视频免费看| 免费18禁网站| 91九色在线观看| 成人无码免费毛片A片| 黄色成人视频网站在线观看| 广州媚黑妇系列视频在线| 91夜夜| 久久99老妇伦国产熟女| 一插菊花综合网| 无套内射免费视频| 91av一区| 日韩一区二区免费视频| 国产福利视频在线| 亚洲俺去了| 人人看人人澡| 四lll少妇BBBB槡BBBB| 成人性爱在线观看| 黑人av在线观看| 成人午夜婬片A片| 亚洲午夜在线| 中文字幕1区| 欧美性爱操逼视频| 欧美一级黃色A片免费看蜜桃熟了 一级a一级a免费观看免免黄‘/ | 手机av网站| 美女靠逼视频| 丰满少妇一区二区三区| 日韩无码不卡| 日本在线视频不卡| 亚洲国产无码在线观看| 亚洲无码视频免费在线观看| 欧洲尤物不卡播放六区| 日韩熟妇人妻中文字幕| 中文字幕丰满熟妇人妻| jizz在线免费观看| 国产麻豆电影在线观看| 免费看黄色片视频| 97精品人人妻人人| 91人妻人人澡人人爽| 亚州一级二级| 亚洲V在线| 免费黄色视频网站| 亚洲在线高清视频| 国产一级婬乱A片| 拍真实国产伦偷精品| 成人黄色免费| 欧洲无码一区二区三区| 性爱一级| 強姦婬片A片AAA毛片Mⅴ| 久久人妻视频| 超碰成人在线免费观看| 中文字幕一区二区三区四区在线视频| A亚洲天堂| 蜜桃AV在线观看| 国产麻豆精品成人毛片| 在线国产视频| 国产性播放| 久久另类TS人妖一区二区| 中文字幕第八页| av国产精品| 久久午夜无码鲁丝| 麻豆专区| 韩日不卡视频| 3D动漫精品啪啪一区二区竹笋| 欧美性爱-熊猫成人网| 日本人人操人人摸| 色婷婷成人网| 草在线视频| 搞黄免费视频视频| 中文无码高清视频| 97视频在线免费观看| 欧美性交一区二区| 久久午夜无码人妻精品蜜桃冫| 91丨PORNY丨丰满人妻网站| 无码视频播放| 爱爱视频天天操| 18禁一区| 久久久久久国际四虎免费精品视频 | 在线观看老湿视频福利| 欧美日韩免费在线观看| 麻豆视屏| 五月天高清无码| 夜夜国自一区| 2024男人天堂| 免费69视频| 亚洲一区二区黄色电影视频网站| 男人天堂视频在线| 操屄免费视频| 亚洲自拍天堂| 天天爽天天爽成人A片影院| 五月婷婷欧美| 国产91丝袜在线播放| 亚洲电影无码| 猫咪视频大全视频| 天堂网av2014| 91成人视频18| 婷婷精品秘进入| 日韩乱伦AV| 欧美日韩成人| 日本黄色A片免费看| 免费在线看黄网站| 青娱乐亚洲精品视频| 欧美精品性爱视频| 中文字幕成人电影| 成人无码影院日韩,成人年…| 欧美午夜在线| AV无码国产| 美女操逼图| 五月久久| 日本欧美一区二区三区| 777久久久| 一区二区三区四区日韩| 理论片91| 男人天堂手机视频| 三级网址在线| 成人三级在线| 影音先锋三级资源| 一级a一级a爱片免费视频| 插入综合网| 日韩无码字幕| 男女啪啪网站| 亚洲精品久久久久毛片A级绿茶| 五月激情丁香| www.有码99| 国产成人大片| 久久国产精| 杨贵妃一级婬片90分钟| 中文字幕乱伦性爱| 日本中文字幕网站| 国产无码一区二区| 91精品婷婷国产综合久久蝌蚪| 欧美大香蕉网| 国产女人十八水真多| 午夜理论片| 一级A片久久久免费直播间| 人妻体内射精一区二区三区 | 激情五月天开心网| 内射国产| 人成视频免费观看| 精品久久久久久久久久久| A级视频网| 中文字幕一区在线| 国产无码成人电影| 国产网址| 欧美性交一区二区| 久久精品黄色| 日鸡吧链接| 爱操影院| 波多野结衣AV在线| 色小说在线| 日本黄色免费视频| 一级黄色性爱视频| 成人777| 尤物视频在线观看视频| 东京热精品视频| 国产一级生活片| 久热精品视频在线观看| 丁香久久婷婷| 婷婷精品视频| 国产日韩欧美91| 久久国产av| 色婷婷狠| 东方AV在线观看| 息子交尾一区二区三区| 九九热精品视频在线播放| 免费观看在线黄片| 特级特黄AAAAAAAA片| 国产在线1| 日韩中文字幕无码| 天天日少妇| 在线免费无码| 51妺嘿嘿在线电影免费观看| 黄色福利视频| 九色首页| 丹麦电影《下午》| 内射视频在线免费观看| 色丁香视频在线观看的| 欧美激情无码一区二区三区张丽| 91丨豆花丨成人熟女| a天堂8在线资源| 西西人体大胆ww4444图片| 欧美一区不卡| 在线日韩一区二区| 亚洲天堂视频在线| 欧美黄色一级网站| 欧美精产国品一二三产品在哪买| 老太老熟女城中层露脸60| 日本人妻A片成人免费看片| 国产三级黄| 天美果冻麻豆国产一区| 欧美日韩一级电影| 老太奶性BBwBBw侧所| 国产精品国产三级国产专业不| 精品国产AV鲁一鲁一区| 亚洲精品无码久久| 中文字幕+乱码+中文乱码91在线观看| 国产伦精品一区二区三区妓女| 婷婷五月天色播| 日韩小电影| 色婷婷中文| 爱插美女网| 激情国产av| 波多一区| 老女人的逼| 久久精品偷拍视频| 日韩情色片| 伊人久久国产| 欧美国产日韩视频| 国产操逼逼| 永久免费AV| 中文字幕观看| 超碰天天操| 午夜老湿机| 大鸡吧网站| 中文字幕少妇| 最新福利视频| 国产91精品在线观看| 国产一级做a爱免费视频| 免费视频| 欧美日韩在线视频免费| 精品无码一| 国产主播在线播放| 亚洲综合图色40p| 在线看a片| 亚洲成人精品一区二区| 69成人导航| 色婷婷色99国产综合精品| 啪啪免费| 男女日皮视频| 蜜芽成人网| 9l蝌蚪PORNY中文| 91亚洲电影| 黄a在线| 11孩岁女精品A片BBB| 波多野结衣无码电影| 国产精品国产三级囯产普通话2 | 超小超嫩国产合集六部| 国产精品无码乱伦| 色女人天堂| 少妇搡BBBB搡BBB搡AA| 先锋影音资源站av每日资源在线 | 欧美性极品少妇精品网站| 插插网站| 欧美国产精品一区二区三区| 亚洲成人视频在线观看| 国产7777| 简单AV网| 国产av资源| 亚洲va中文字幕| 婷婷五月综合激情| 亚洲天堂影院| 成人精品水蜜桃| 天天操人人射| 天天色播| 欧美亚洲一区二区三区| 中文字幕第27页| 伊人成人在线视频| 中文字幕永久在线观看| 婷婷V亚洲V丁香月天V日韩V| 国产精品秘久久久久久久久| 欧洲亚洲免费视频| 91人妻人澡| 日韩看片| 高清无码做爱视频| 成人无码影院日韩,成人年…| 日韩一级在线| 九九热超碰| 人人夜夜人人| 亚洲精品一区二区三区蜜桃| 五月丁香天堂网| 波多野59部无码喷潮| 中文字幕黑人无码| 五月精品| 欧亚免费视频| 日本性爱网址| 国产一级在线| 国产麻豆三级片| 国产精品乱伦片| www.青青草视频| 中文精品字幕人妻熟女| 操逼爽| 国产久久精品视频| 蜜桃免费视频| 99re免费视频| 人人舔人人草| 久久中文字幕综合| 高清视频一区二区| 午夜啪啪视频| 亚洲成人视频一区二区| 亚洲乱妇| 欧洲成人免费视频| 狠狠色噜噜狠狠狠7777| 欧美一级片免费看| 国产一级无码| 日韩精品三级| 一级特黄毛片| 久久久电影| 国产黄片免费观看| 婷婷性爱五月天| 蜜桃人妻无码AV天堂二区| 亚洲猛男操逼欧美国产视频 | 丰臀肥逼高清视频电影播放| 熟女视频网站| 久久久久久免费毛片精品| 黄色大片AV在线| 国产成人av网站| 在线免费看黄视频| 久久艹精品视频| 一区二区精品| 嗯啊av| 免费无码国产在线55| 亚洲午夜影院在线| 日韩免费高清| 亚洲av高清无码| 亚洲AV无码精品久久一区二区 | 91免费观看网站| 五月天婷婷在线无码| 亚洲一级内射| 亚洲精品久久久蜜桃| 夜操操| 黄色电影一区二区三区| 亚洲电影在线观看| 人妻少妇一区| 日本免费无码| 午夜视频网| 性爱视频91| 水果派AV解说| 日韩欧美内射| 国产精品无码在线播放| av老鸭窝| 长腿女神打扫偷懒被主人猛操惩罚| 中文无码熟妇人妻AV在线| 日韩三级成人| 亚洲国产成人AV| 亚洲黄片在线| 色天堂色天使| 在线大香蕉| 性爱福利视频| 一级欧美黑人大战白妞| 91av在线电影| 欧美黄色网视频| 亚洲午夜剧场| 99re在线观看视频| 人人操人人操人人操人人| 国产精品1区2区3区| 色99在线视频| 无码视频在线| 亚洲大片| 欧美日韩一区二区在线观看| 粉嫩小泬BBBBBB免费看| 色综合99久久久无码国产精品 | 操极品少妇逼| 精品AV国产| 无码一区精品久久久成人| 99精品视频在线播放免费| 青青青草视频在线| AV怡红院| 亚洲AV无码乱码国产精品| 日本在线不卡一区| 欧美丝袜脚交xxxxBH| 制服丝袜人妻| 99久久国| 国产成人无码精品久在线观看| 国产激情一区二区三区| 国产在线观看一区| 国产和日韩中文字幕| 嫩草视频在线观看| 亚洲色欧美| 欧美XXX黑人XYX性爽| 亚洲精品美女| 特黄无码| 久久精品三级视频| 被男友内S~高H文| 成人在线视频免费观看| 欧美三P囗交做爰XXXⅩ| 精品视频免费观看| 成人午夜福利视频| 成人A∨| 三级影片在线观看性| 日韩视频三区| 苗条一区小视频| 国产精品成人AV在线| 亚洲AV毛片| 久久亚洲免费视频| 国产裸体网站| 亚洲污污| 五月天婷婷在线视频| 亚洲成人人妻| 欧美成人精品无| 高清无码在线免费观看| 成人性生活免费视频| 四川乱子伦95视频国产| 91精品丝袜久久久久久久久粉嫩| 美日韩一区二区三区| 麻豆传媒在线| 丁香久久婷婷| 久热中文在线观看精品视频 | 成人黄网免费观看视频| 国产AV资源网| 91黄色视频网站| 刘玥精品国产一区二区三区| 美日韩一区| 性爱A级视频| 777偷窥盗摄00000| 国产成人女人在线观看| 中文字幕免费观看| 亚洲欧美久久| 色婷婷导航| 亚洲欧美成人网| 国产乱子伦视频国产印度| 美女自慰网站免费| 无码人妻丰满熟妇区蜜桃| 女人18片毛片90分钟免费明星| 日逼免费| 一级a一级a爰片免费免免中国A片 一级一级a免一级a做免费线看内裤 | 国产又黄又| 一级片网址| 伊人666| av日韩在线播放| 天天爽天天| 女人自慰网站在线观看| 日本处女性高潮喷水视频| www.黄片| 国内久久| 国产欧美熟妇另类久久久| 免费在线黄色电影| 高清国产mv在线观看| 操b视频在线观看| 69精品无码成人久久久久久| 亚洲免费黄色视频| 91视频中文字幕| 不卡无线在一区| 北条麻妃波多波多野结衣| 99自拍网| 国产白丝精品91爽爽久久| 国产激情无码免费| 免费看黄色毛片| 成人网站中文字幕| 日韩一区二区三区四区久久久精品有吗 | AV黄色网址| 亚洲精品秘一区二区三小| 精东影业AV无码精品| 五月天久久精品| 久久黄色的| 亚洲黄色毛片| 亚洲日韩三级| 爱爱免费看片| 操美女视频网站| 天天舔天天干| 五月天一区二区三区| 91精品婷婷国产综合久久蝌蚪| 日本道在线视频| 好吊妞在线观看| 国产三级片91| 欧美日韩字幕| 久草国产在线视频| 四川少妇搡bbw搡bbbb| 色欲精品| 国产成人自拍偷拍视频| 欧美成人网站免费在线观看| 男人的天堂网页| 亚洲精品影视| 黄色一级视频在线观看| 久久久久久久久久成人| 在线香蕉| 日韩在线你懂的| 91九色TS另类国产人妖| 国产毛片久久久久久久| 亚洲成人免费在线| 日本一级婬片免费放| 青青草无码在线| 51妺嘿嘿午夜福利在线| 欧美一级AA大片免费看视频| 色婷婷五月天在线观看| 一级片av| 久久99久久99久久99| 操操干| 国产欧美一区二区三区视频在线观看| 无码免费视频观看| 国产在线观看黄色| 九九热热| 日韩精品久久| 在线大香蕉| 中文字幕成人电影| 欧美操逼网| 芳芳的骚逼| 米奇7777狠狠狠狠| 夜夜狠狠躁日日| 久久精品片| 最新中文字幕无码| 曰韩精品| 中文精品在线| 色老板在线观看视频| 无码伦理| 欧美婷婷综合| 久操综合视频在线| 大香伊人蕉| 亚洲精品色色| 欧美激情婷婷| 亚洲AV片一区二区三区| 亚洲成a人无码| 日韩AⅤ无码一区二区三区| 亚洲综合中文字幕在线播放| 亚洲黄色在线免费观看| 亚洲一级a片| 91看片看婬黄大片Videos| 国产成人无码一区二区在线播放| 欧美熟妇搡BBBB搡BBBBB| 黑人巨大翔田千里AⅤ| 国产午夜成人免费看片无遮挡| 骚逼黄片| 成人免费av| 一区二区三区无码精品| 日韩精品一区二区三免费视频| 狠狠操狠狠插| av无码免费在线观看| 成人黄色免费在线| 国产精品视频在线免费观看| 欧美一级特黄AAAAAA片| 五月婷婷色综合| 七十路の高齡熟妇无码| 五月天丁香| 麻豆一区二区三区| 免费看日P视频| 足交| 日韩成人性爱网站| 亚洲国产视频一区| 久久婷婷成人综合色怡春院| 欧美性BBB槡BBB槡BBB| 人人草人人操| 成人H动漫精品一区二区三区蘑菇| 日韩欧美国产高清91| 日韩一级A片| 免费AV网站观看| 最新中文字幕无码| av网站免费在线观看| 激情伊人五月天| 伊人国产女| 成人乱无码AV在线观看| 色色成人网| 懂色中国闺密偷情懂色AV| 国产拍拍视频| 天天草天天日| 亚洲AⅤ无码一区二区波多野按摩| 欧美成年人网站| 无码AV中文字幕| 淫揉BBB揉揉揉BBBBB| 午夜av在线| 精品无码免费看专区| 边摸边插| 五月婷在线视频| 91福利网站| 69AV在线播放| 一区在线播放| 亚洲中文字幕在线视频| 四季AV一区二区凹凸懂色桃花| 先锋影音男人资源站| 免费版成人久久幺| 国产伦精一品二品三品app| 激情AV| 一级欧美一级日韩| 亚洲中文字幕人妻。| 欧美日韩大屌| 日韩欧美一区二区在线观看| 亚洲无码www| 黄网站免费在线观看| 99视频免费观看| 久久久18禁一区二区三区精品 | 日韩字幕无码| 精品国产A片| 欧美精产国品一区二区区别| 五月天激情电影| 青草av在| 青草视频在线观看免费| 青青草免费在线观看| 国产作爱| 国产性爱在线观看| 亚洲中文字幕av| 人妻无码精品久久人妻成人| 久久久高清无码视频| 亚洲精品女人久久久| 国产精品视频福利| 一夲道无码专区av无码A片| 在线观看高清无码中文字幕| 日韩在线观看免| 国产videos| 久久久久久久网站| 国产视频中文字幕| 久久伊人春色| 黄色爱爱视频| 欧美成年人网站| 欧美理论片在线观看| 婷婷久久五月天| 国产成人三级在线| 人妻黑人一区二区三区| 日韩AV小电影| 亚洲无码网| 无码一区精品久久久成人| 在线看毛片网站| 欧美中文字幕| 爱搞视频在线播放| 国产强伦轩免费视频在线| 996久久| 成人精品秘久久久按摩下载| 人妻精品久久久久中文字幕69| 日韩欧美成人在线| 成人在线网站| 三级视频网址| 欧美性猛交XXXX乱大交HD| 一本大道DVD中文字幕| 91久久久久| 中文字幕成人av| 亚洲毛片网站| 91精品婷婷国产综合久久| 婷婷色色五月天| 婷婷成人五月天| 亚洲娱乐在线| 能看的av网站| 人成视频在线观看| 人人草超碰| 88在线无码精品秘入口九色| 免费av在线播放| wwwA片| 中文字幕一区三区人妻视频| 午夜福利100理论片| 中文字幕一区二区三区免费2023| 免费看操逼| 人人草在线| 特黄AAAAAAAAA真人毛片| 国产精品a片| 在线免费观看黄片| 精品中文视频| 黄色一级视频网站| 无码视频一区| 成人女人18女人毛片| 无码国产+白浆| 69成人无码| 五月丁香在线视频| 96精品久久久久久久久久| 3D动漫精品啪啪一区二区竹笋 | 少婦揉BBBB揉BBBB揉| 久久久久久久久久8888| 中文字幕在线观看免费| 日韩欧美一级A片| 色噜| 日韩中文字幕有码| 蜜桃av秘一区二区三区| 亲子伦一区二区三区观看方式| 色婷婷综合激情| 无码少妇| 不卡无码中文字幕| 91AV免费观看| 国内精品无码| 免费AV资源在线观看| 小明看台湾成人永久免费视频网站| 亚洲三级片在线视频| 美女网站黄a| 无码在线观看免费| 久久久久黄色| 91麻豆大奶巨乳一区白虎| 自慰一区二区| 911精品国产一区二区在线| 亚洲天堂自拍| 人人上人人操| 无码V| 波多野结衣网址| 青草久操| 天天爱天天爽| 国产av福利| 高清无码视频在线| 九九热re99re6在线精品| 国产又粗又大| 欧美天天性| 中文字幕熟女| 无码在线免费观看视频| 欧美性爱免费在线视频| 免费无码婬片AAAA片老婦 | 成人在线中文字幕| 在线天堂v| 俄罗斯白嫩BBwBBwBBw91| 欧美综合色| 午夜AV福利影院| 91天堂在线| 日本成人电影| 欧美三级欧美一级| 亚洲中文综合| AV无码在线观看| 野花Av| 久久噜噜| ⅴA日本成人| 韩国无码视频在线观看| 中文字幕精品在线观看| 大香蕉网站在线观看| 亚洲色色色| 无码专区一区二区三区| 日韩无码一区二区三| 69AV视频在线观看| 丁香五月天堂网| 天天干天天日天天干天天日| 男女69视频| 精品国产乱码一区二区| 亚洲在线成人视频| 四虎国产| 亚洲综合免费观看高清完整版在线观 | 国精产品一区二区三区在线观看 | 在线不卡 | 国产人妻在线| 五月天婷婷影院| 天天射天天日天天干| 北条麻妃在线观看| 搞搞网日本9| 88AV在线视频| 久久久五月天| 成人网站大香蕉|