Spring AOP:如何从方面中的 URI 模板读取路径变量值?

2023-11-30

我想创建 Spring 方面,它将由自定义注释注释的方法参数设置为由 URI 模板中的 id 标识的特定类的实例。路径变量名称是注释的参数。与 Spring 非常相似@PathVariable does.

因此该控制器方法将如下所示:

@RestController
@RequestMapping("/testController")
public class TestController {

    @RequestMapping(value = "/order/{orderId}/delete", method = RequestMethod.GET)
    public ResponseEntity<?> doSomething(
            @GetOrder("orderId") Order order) {

        // do something with order
    }

}

而不是经典:

@RestController
@RequestMapping("/testController")
public class TestController {

    @RequestMapping(value = "/order/{orderId}/delete", method = RequestMethod.GET)
    public ResponseEntity<?> doSomething(
            @PathVariable("orderId") Long orderId) {

        Order order = orderRepository.findById(orderId);
        // do something with order
    }
}

注释来源:

// Annotation
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface GetOrder{

    String value() default "";
}

方面来源:

// Aspect controlled by the annotation
@Aspect
@Component
public class GetOrderAspect {

    @Around( // Assume the setOrder method is called around controller method )
    public Object setOrder(ProceedingJoinPoint jp) throws Throwable{

        MethodSignature signature = (MethodSignature) jp.getSignature();
        @SuppressWarnings("rawtypes")
        Class[] types = signature.getParameterTypes();
        Method method = signature.getMethod();
        Annotation[][] annotations = method.getParameterAnnotations();
        Object[] values = jp.getArgs();

        for (int parameter = 0; parameter < types.length; parameter++) {
            Annotation[] parameterAnnotations = annotations[parameter];
            if (parameterAnnotations == null) continue;

            for (Annotation annotation: parameterAnnotations) {
                // Annotation is instance of @GetOrder
                if (annotation instanceof GetOrder) {
                    String pathVariable = (GetOrder)annotation.value();                        

                    // How to read actual path variable value from URI template?
                    // In this example case {orderId} from /testController/order/{orderId}/delete

                    HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder
                            .currentRequestAttributes()).getRequest();
                    ????? // Now what?

                }
           } // for each annotation
        } // for each parameter
        return jp.proceed();
    }
}

2017 年 4 月 4 日更新:

给出的答案迈克·沃伊蒂纳回答了问题 -> 因此它被接受。

给出的答案橙狗使用现有 Spring 工具从不同角度解决问题,而不会冒新方面实施问题的风险。如果我早知道的话,就不会问这个问题了。

谢谢你!


如果您已经有权访问HttpServletRequest, 您可以使用HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTEspring 模板选择请求中所有属性的映射。你可以这样使用它:

request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE)

结果是Map实例(不幸的是,您需要转换为它),因此您可以迭代它并获取您需要的所有参数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring AOP:如何从方面中的 URI 模板读取路径变量值? 的相关文章

随机推荐

  • 删除列名称中的字符

    例如我有以下数据 Ind var1 1 var2 2 var3 1 var4 2 var100 1 1 0 0 2 1 0 2 2 0 1 0 2 我想重命名后面没有两个字符的列 如下所示 Ind var1 var2 var3 var4 v
  • 如何在 PHP 中使用 gettext?

    我有一个文件dk po and dk mo在我的 webdir 的文件夹 lang 中 我该如何使用这个文件 我已经尝试了所有 但我无法让它工作 Lang putenv LC ALL dk setlocale LC ALL dk Speci
  • 针对不同设备应用分辨率

    我一直在尝试为一系列设备设置屏幕分辨率 我已经查找了所有答案 根据我的理解 如果我创建 res layout normal res layout large 等 我可以在那里放置调整后的布局应用程序将自动加载它们 怎么还没有出现这样的情况
  • LINQ 连接查询(表之间具有可为空的引用)

    我有3张桌子 例如Client Company and Address 客户已收到公司的参考 公司有 2 个可空的地址引用 账单和运输 因此在某些情况下地址可能不存在 我需要进行联接查询 但万一Company BillingAddress
  • Android 11:启动另一个应用程序的服务

    第一个应用程序有一个服务
  • 使用 GSON 序列化对象

    如何使用 gson 将此对象序列化和反序列化为 json public class test Expose public List lt Pair
  • URL 连接字符串的正则表达式

    是否有已知的 JavaScript 正则表达式可以匹配整个 URL 连接字符串 protocol user password hostname 12345 segment1 segment2 p1 val1 p2 val2 我正在寻找一个正
  • 为什么clojure中的Symbol可以用作函数? [复制]

    这个问题在这里已经有答案了 我建议您参考这个简短的代码 a 1 gt nil a 1 2 gt 2 为什么符号可以a在这种情况下用作函数 它允许您以良好的语法查找以符号为键的地图 下面是等价的 a my hash map get my ha
  • Android 中 Youtube 网站的 WebView 问题?

    我尝试在我的应用程序的网络视图中加载网址 ww youtube com 但无法完全加载 它加载如下图所示 在浏览器中它可以轻松加载 为什么 任何想法 图片http www freeimagehosting net uploads d7356
  • 在java中将国际字符串转换为\u代码

    如何将国际 例如俄语 字符串转换为 u数字 unicode 数字 e g u041e u041a for OK 有一个JDK工具通过命令行执行如下 native2ascii encoding utf8 src txt output txt
  • 如何在 Windows 上配置 Visual Studio Code for C++?

    我遇到配置问题启动 json我的 Windows 上的文件 它显示错误消息 调试适配器进程意外终止 I have set up MinGW and configured g compiler and now Visual Studio Co
  • 请求在 Postman 中重用

    我们的团队希望自动化 REST API 测试 现在 我们有一个 Postman 请求的集合 并让它们手动跳过 我们可以为每个测试场景创建一个集合 文件夹 但这意味着大量的重复 我们的 API 仍在大力开发中 我真的不想在更改后在 20 个地
  • 属性设置后的 Guice

    有人知道我如何在 Guice 中实现与 相同的功能属性设置后 春天的界面 它是施工后挂钩 到目前为止 如果您使用构造函数注入并且没有做任何太疯狂的事情 最简单的解决方案是创建一个构造后方法并用 Inject final class FooI
  • 为什么 python 模拟补丁不起作用?

    我有两个文件 spike py class T1 object def foo self afd return foo def get foo self return self foo 1 def bar return bar 测试尖峰 p
  • 如何删除MongoDB集合中的TTL?

    我将 mongoose 与 node js 一起使用 我正在测试生存时间功能 并将我的文档设置为在数据库模式中的 X 时间后过期 var adInfos new mongoose Schema inf type Object require
  • 帮助创建递归函数 C#

    我正在创建一个预测应用程序 它将对生产工厂能够运行的各种 模式 进行模拟 该工厂每天可以以一种模式运行 因此我正在编写一个函数 它将每天选择的不同模式相加 以最大程度地提高工厂的产量并与提供的销售预测数字保持最佳一致 该数据将被加载到模式对
  • “需要 TRUE/FALSE 时缺少值”R 中 if 语句中的错误[重复]

    这个问题在这里已经有答案了 我正在尝试计算并打印数据帧第二列和第三列中名为 DATA 的值的情况 但我有 需要 TRUE FALSE 时缺少值 错误 请问你能帮帮我吗 如何在 if 语句中写入条件而不出现此错误 我的代码 deneme lt
  • Docusign 签名 url - 显示复合模板的文档 1

    使用 docusign rest api 我想创建一个包含 2 个文档的信封 然后我将使用收件人帖子视图向第一个收件人 在 iframe 中 显示文档 1 签名后将同一信封中的文档 2 显示给其他收件人 我创建了具有不同 tempalteR
  • 使用 Javascript 检测按键组合系列

    在复活节假期 我想在我开发的网站上举办一个小惊喜 寻找复活节彩蛋 这五个中的两个复活节彩蛋我躲起来将被按键任命 这不会像 同时按下 CTRL 和 TAB 类型的操作 而是 向上按三次 然后向右按三次 类型的操作 这将寻找一系列按键 而不是一
  • Spring AOP:如何从方面中的 URI 模板读取路径变量值?

    我想创建 Spring 方面 它将由自定义注释注释的方法参数设置为由 URI 模板中的 id 标识的特定类的实例 路径变量名称是注释的参数 与 Spring 非常相似 PathVariable does 因此该控制器方法将如下所示 Rest