在SpringBoot REST应用程序中,我具有TableRequest
类型,该类型包含表格式数据的GET请求的列排序,过滤和分页详细信息。它是通用的,因为它不在乎所请求的特定数据是什么,它仅指定通用表参数。因此,它适用于许多不同的控制器方法。另外,由于它适用于GET请求,因此字段作为请求参数(没有@RequestBody
json参数)传递。我在控制器类中有一个@ModelAttribute
方法,该方法将请求参数解析为TableRequest
对象,然后实际的@RequestMapping
方法接收该对象作为@ModelAttribute
参数。
因为TableRequest
类是泛型的,所以我希望能够在多个控制器之间使用它,而不必将解析逻辑复制到每个控制器中。我想知道每当控制器具有@ModelAttribute
输入参数时,是否存在基于Spring-y批注的重用相同TableRequest
方法的方法。
提前致谢 :)
我的解决方案(基于以下选定的答案)
我创建了一个@TableRequestController
注释和一个相应的@ControllerAdvice
类,该类仅适用于具有该注释的控制器类。该ControllerAdvice类包括@ModelAttribute
方法,该方法将GET请求参数解析为TableRequest
对象。
一个重要的警告是,新的@TableRequestController
只能整体应用于Controller类,而不能应用于单个控制器方法。这样,我创建了一个单独的内部控制器类,并用该注释标记,该类的@RequestMapping方法都接受TableRequest对象。
@TableRequestController:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface TableRequestController {}
ControllerAdvice类:
@ControllerAdvice(annotations = TableRequestController.class)
public class TableRequestControllerAdvice {
@ModelAttribute
public TableRequest tableRequest(
@RequestParam Map<String, String> params,
@RequestParam int pageStart,
@RequestParam int pageSize) {
return new TableRequest(params, pageStart, pageSize);
}
}
TableRequest REST控制器类:
@RestController
@TableRequestController
public static class MyTableRequestController {
@RequestMapping("/the/table/request/url")
public MyResponse makeTableRequest(
TableRequest tableRequest) {
return new MyResponse(tableRequest);
}
}
最佳答案
您可以使用@ControllerAdvice
。如果您愿意,此处定义的所有内容都适用于所有控制器或已定义的子集。
Documentation
另一种选择(更好的恕我直言)是编写message converter。它仅处理一种特定类型。您不再需要@ModelAttribute
,而只需在控制器方法中使用TableRequest
参数。