gpt4 book ai didi

Java AOP JoinPoint 获取不到参数名

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:09:58 27 4
gpt4 key购买 nike


我正在使用 Java Spring Mvc 和 Spring AOP 从用户那里查找参数名称。
我有一个 Controller ,它从用户那里获取参数并调用服务。
我有一个方面在服务之前运行。
该方面应检查用户名和 apiKey 参数是否存在。
这是我的代码:

Controller :

@RequestMapping(method = RequestMethod.POST, produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String getDomainWithFoundIn(@RequestParam (value="domain") String domain, @RequestParam (value="user") String user, @RequestParam (value="apiKey") String apiKey) throws JsonGenerationException, JsonMappingException, IOException {
return domainService.getDomainDataWithFoundIn(domain, user, apiKey);
}

域服务接口(interface):

public interface IDomainService {
public String getDomainDataWithFoundIn(String domainStr, String user, String apiKey);
}

域名服务:

@Override
@ApiAuthentication
public String getDomainDataWithFoundIn(String domainStr, String user, String apiKey) {
//Do stuff here
}

还有我的 AOP 类:

@Component
@Aspect
public class AuthAspect {
@Before("@annotation(apiAuthentication)")
public void printIt (JoinPoint joinPoint, ApiAuthentication apiAuthentication) throws NoAuthenticationParametersException, UserWasNotFoundException {
final MethodSignature signature = (MethodSignature) joinPoint.getSignature();
final String[] parameterNames = signature.getParameterNames();
**//parameterNames is null here.**
}

在这种情况下,我希望在我的方面获得“域”、“用户”和“apiKey”参数名称。
知道我在这里错过了什么吗?
谢谢,
或者。

最佳答案

正如我在上面的评论中所说,根据代理类型,您可以或不能访问参数名称。如果您的 bean 实现接口(interface),JDK 代理将由 spring 创建,并且在这种代理中 MethodSignature.getParameterNames() 为 null。如果您的 bean 未实现接口(interface),则会创建 CGLIB 代理,其中填充了 MethodSignature.getParameterNames()。

如果可以,您可以通过删除 bean 接口(interface)切换到 CGLIB 代理 bean,它应该可以工作。

我现在也在为同样的问题苦苦挣扎,我无法删除接口(interface)。我为此想出了不同的解决方案。在界面上,我可以通过一些自定义注释来标记我的参数:

interface MyInterface {
void myMetod(@ParamName("foo") Object foo, @ParamName("bar") Object bar);
}

现在在 AOP 代理中,我可以在以下位置获取此信息:

MethodSignature.getMethod().getParameterAnnotations()

关于Java AOP JoinPoint 获取不到参数名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25226441/

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