今天在項目中書寫分頁接口的時候,在Controller層和dao層分別用了@RequestParam和@Param這兩個註解。簡單說一下對這兩個註解的理解。前端
通常用在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";
}
複製代碼
通常用在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
聚沙成塔,滴水穿石!測試