将Spring ModelAttribute应用于使用特定参数类型的所有控制器


问题内容

在SpringBoot
REST应用程序中,我有一个TableRequest类型,其中包含针对表格数据的GET请求的列排序,过滤和分页详细信息。它是通用的,因为它不在乎所请求的特定数据是什么,它仅指定通用表参数。因此,它适用于许多不同的控制器方法。另外,因为它适用于GET请求,所以字段作为请求参数(没有@RequestBodyjson参数)传递。我@ModelAttribute在控制器类中有一个将请求参数解析为TableRequest对象的@RequestMapping方法,然后实际方法将该对象作为@ModelAttribute参数接收。

因为TableRequest该类是通用的,所以我希望能够在多个控制器之间使用它,而不必将解析逻辑复制到每个控制器中。我想知道@ModelAttribute每当控制器具有TableRequest输入参数时,是否存在基于Spring-
y批注的重用相同方法的方法。

提前致谢 :)


我的解决方案 (基于以下选定的答案)

我创建了一个@TableRequestController注释和一个相应的@ControllerAdvice类,该类仅适用于具有该注释的控制器类。该ControllerAdvice类包括将@ModelAttributeGET请求参数解析为一个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。如果您愿意,此处定义的所有内容都适用于所有控制器或已定义的子集。

文献资料

另一种选择(更好的恕我直言)是编写消息转换器。它仅处理一种特定类型。您不再需要,@ModelAttribute而只需TableRequest在控制器方法中有一个参数。