gpt4 book ai didi

Spring AOP : How to read path variable value from URI template in aspect?

转载 作者:行者123 更新时间:2023-12-02 07:20:47 28 4
gpt4 key购买 nike

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

Controller 方法如下所示:

@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 日更新:

Mike Wojtyna给出的答案回答了问题 -> 因此它被接受。

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

谢谢!

最佳答案

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

request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE)

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

关于 Spring AOP : How to read path variable value from URI template in aspect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43183537/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com