如何正确覆盖抽象通用 restcontroller 中声明的方法?
How can I properly override a method declared in an abstract generic restcontroller?
我在通过一些预先存在的代码实现功能时遇到了一些问题。
从事此项目的其他程序员之前定义了一个通用抽象 "restcontroller"(它实际上并未注释为 @RestController
,但它意味着通过带有该注释的 classes 进行扩展)
public abstract class AbstractController<T extends AbstractEntity, R extends JpaRepository<T, Integer>> {
@GetMapping(value = "/getall")
public Paging<T> getAll(@RequestParam Integer itemsPerPage,
@RequestParam Integer pageIndex,
@RequestParam Map<String, String> filters,
@Autowired Consumer consumer) {
//Fetch entities of type T from repository R and return them
}
//other generic crud operations
}
这 class 通常由具体的控制器扩展,这些控制器只在其特定类型上定义其他操作,但不改变通用的 crud 操作。
我想要做的是扩展此 class,但覆盖 getAll 方法,如下所示:
@RestController
@RequestMapping("/api/tasks")
public class TaskController extends AbstractController<Task, TaskRepository> {
@Override
public Paging<Task> getAll(Integer itemsPerPage, Integer pageIndex, Map<String, String> filters, Consumer consumer) {
LoggerFactory.getLogger(LazyTaskController.class).log("function called successfully!");
Paging<Task> paging = super.getAll(itemsPerPage, pageIndex, filters, consumer);
//do things with return value before returning
return paging;
}
}
如果我在不覆盖 getAll 方法的情况下调用 BASEURL/api/tasks/getall?itemsPerPage=25&pageIndex=0
,则参数连接正确(Map 包含两个值,itemsPerPage 和 pageIndex,如预期的那样,consumer 包含 intercace Consumer 的具体实现)。
但是,如果我确实覆盖了它,则 Map 出于某种原因包含两个值,一个具有键 "consumer" 和代理类型,另一个具有键 "org.springframework.validation.BindingResult.consumer" 和 BeanPropertyBindingResult 类型的值;消费者包含一个代理。
我想 @Override 会干扰 Consumer 的自动装配,但我不知道如何正确地实现我的想法(在返回之前处理 getAll 的结果)。
提前谢谢你
没关系,我解决了
通过向重写的方法参数添加@RequestParam 和@Autowired 注释解决了 Map 的问题。
Consumer 具体类型的问题通过应用我在代码库中的另一个 class 上找到的自定义注释以某种方式解决了,我仍然不确定该注释的作用但至少我知道现在要查找什么.
我在通过一些预先存在的代码实现功能时遇到了一些问题。
从事此项目的其他程序员之前定义了一个通用抽象 "restcontroller"(它实际上并未注释为 @RestController
,但它意味着通过带有该注释的 classes 进行扩展)
public abstract class AbstractController<T extends AbstractEntity, R extends JpaRepository<T, Integer>> {
@GetMapping(value = "/getall")
public Paging<T> getAll(@RequestParam Integer itemsPerPage,
@RequestParam Integer pageIndex,
@RequestParam Map<String, String> filters,
@Autowired Consumer consumer) {
//Fetch entities of type T from repository R and return them
}
//other generic crud operations
}
这 class 通常由具体的控制器扩展,这些控制器只在其特定类型上定义其他操作,但不改变通用的 crud 操作。
我想要做的是扩展此 class,但覆盖 getAll 方法,如下所示:
@RestController
@RequestMapping("/api/tasks")
public class TaskController extends AbstractController<Task, TaskRepository> {
@Override
public Paging<Task> getAll(Integer itemsPerPage, Integer pageIndex, Map<String, String> filters, Consumer consumer) {
LoggerFactory.getLogger(LazyTaskController.class).log("function called successfully!");
Paging<Task> paging = super.getAll(itemsPerPage, pageIndex, filters, consumer);
//do things with return value before returning
return paging;
}
}
如果我在不覆盖 getAll 方法的情况下调用 BASEURL/api/tasks/getall?itemsPerPage=25&pageIndex=0
,则参数连接正确(Map 包含两个值,itemsPerPage 和 pageIndex,如预期的那样,consumer 包含 intercace Consumer 的具体实现)。
但是,如果我确实覆盖了它,则 Map 出于某种原因包含两个值,一个具有键 "consumer" 和代理类型,另一个具有键 "org.springframework.validation.BindingResult.consumer" 和 BeanPropertyBindingResult 类型的值;消费者包含一个代理。
我想 @Override 会干扰 Consumer 的自动装配,但我不知道如何正确地实现我的想法(在返回之前处理 getAll 的结果)。
提前谢谢你
没关系,我解决了
通过向重写的方法参数添加@RequestParam 和@Autowired 注释解决了 Map 的问题。
Consumer 具体类型的问题通过应用我在代码库中的另一个 class 上找到的自定义注释以某种方式解决了,我仍然不确定该注释的作用但至少我知道现在要查找什么.