Java後端避坑——@RequestParam和@Param註解

今天在項目中書寫分頁接口的時候,在Controller層和dao層分別用了@RequestParam和@Param這兩個註解。簡單說一下對這兩個註解的理解。前端

@RequestParam:

通常用在Controller層,用來解決前端與後端參數不一致的問題,在參數上加上@RequestParam,那麼前端的參數必須和後端參數一致,不然會報錯。當只有一個參數的時候,Controller層中@RequestParam和@Param能夠互用,當有多個參數的時候,Controller層中@RequestParam和@Param不能互用java

示例程序以下:

@GetMapping("/")
public RespPageBean getAllEmployeeByPage(@RequestParam(defaultValue = "1")Integer page,@RequestParam(defaultValue = "10")Integer size){
     return salaryService.getAllEmployeeByPage(page,size);
}
複製代碼

另外一個做用是指定Value或name的參數名,或者指定參數是否必傳 ####該註解的底層代碼以下:spring

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
    @AliasFor("name")
    String value() default "";

    @AliasFor("value")
    String name() default "";

    boolean required() default true;

    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
複製代碼

@Param:

通常用在dao層,用來給參數命名,在Mybatis的mapper中加上該註解,傳遞的參數與Sql中的字段名一致。apache

示例程序以下:

List<Employee> getAllEmployeeByPage(@Param("page") Integer page, @Param("size") Integer size);
複製代碼

該註解的底層代碼以下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface Param {
    String value();
}
複製代碼

筆者測試了一下將上面程序中的@Param註解更換爲@RequestParam,程序編譯沒有報錯,可是點擊前端頁面的分頁組件時,出現了以下錯誤:後端

2019-04-25 21:23:48.703 ERROR 9148 --- [nio-8082-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'page' not found. Available parameters are [arg1, arg0, param1, param2]] with root cause org.apache.ibatis.binding.BindingException: Parameter 'page' not found. Available parameters are [arg1, arg0, param1, param2]mybatis

錯誤代碼示例以下:

List<Employee> getAllEmployeeByPage(@RequestParam("page") Integer page, @RequestParam("size") Integer size);
複製代碼

建議在書寫代碼的時候,保持良好的書寫習慣,不隨意書寫代碼,便能避開不少沒必要要的坑!app

聚沙成塔,滴水穿石!測試

相關文章
相關標籤/搜索