java - 将 Spring ModelAttribute 应用于所有使用特定参数类型的 Controller

标签 java spring spring-mvc

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

因为 TableRequest 类是通用的,我希望能够跨多个 Controller 使用它,而不必将解析逻辑复制到每个 Controller 中。我想知道是否有一种基于 Spring-y 注释的方法可以在 Controller 具有 TableRequest 输入参数时重用相同的 @ModelAttribute 方法。

提前致谢:)


我的解决方案(基于下面选择的答案)

我创建了一个 @TableRequestController 注释和一个相应的 @ControllerAdvice 类,它仅适用于具有该注释的 Controller 类。该 ControllerAdvice 类包括 @ModelAttribute 方法,该方法将 GET 请求参数解析为 TableRequest 对象。

这里有一个重要的警告是新的 @TableRequestController 只能作为一个整体应用到 Controller 类,而不是单独的 Controller 方法。因此,我创建了一个单独的内部 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 Controller 类:

@RestController
@TableRequestController
public static class MyTableRequestController {

    @RequestMapping("/the/table/request/url")
    public MyResponse makeTableRequest(
            TableRequest tableRequest) {

        return new MyResponse(tableRequest);
    }
}

最佳答案

您可以使用@ControllerAdvice。如果您愿意,此处定义的所有内容都适用于所有 Controller 或定义的子集。

Documentation

另一种选择(更好的恕我直言)是写一个 message converter .它只处理一种特定类型。您不再需要 @ModelAttribute,只需在您的 Controller 方法中添加一个 TableRequest 参数即可。

关于java - 将 Spring ModelAttribute 应用于所有使用特定参数类型的 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33155890/

相关文章:

java - 如何将资源映射到枚举常量?

java - Spring Boot - ErrorPageFilter 找不到 RequestDispatcher

java - 如何在 Spark sql 中舍入值

java - 索引@MultiField spring-data-elasticsearch。国际化目的

java - 选择 X 窗口

java - Flux.buffer() 不适用于 switchIfEmpty

Spring @Cacheable 不缓存

java - 如何在 eclipse RCP 中创建像 windowbuilder 一样的 EditorPart

spring -/oauth/token 中的 XSRF token 无效

java - Spring boot - 返回 403 Forbidden 而不是重定向到登录页面