gpt4 book ai didi

java - 带有目标的注释的 Spring aliasFor(参数)

转载 作者:搜寻专家 更新时间:2023-11-01 02:21:47 24 4
gpt4 key购买 nike

我正在尝试使用 aliasFor 注释使用 spring 的元注释为 Spring 创建自定义注释 RequestParam

简单地“扩展/替换”

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {

@AliasFor("name")
String value() default "";

----
}

加上我的注释

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface QueryParam {

@AliasFor(annotation = RequestParam.class, attribute = "name")
String name() default "";

@AliasFor(annotation = RequestParam.class, attribute = "required")
boolean required() default false;

@AliasFor(annotation = RequestParam.class, attribute = "defaultValue")
String defaultValue() default ValueConstants.DEFAULT_NONE;

}

这样它会抛出异常

org.springframework.core.annotation.AnnotationConfigurationException:   @AliasFor declaration on attribute [name] in annotation [package.QueryParam] declares an alias for attribute [name] in meta-annotation [org.springframework.web.bind.annotation.RequestParam] which is not meta-present.

问题是,如果没有在 QueryParam 上注释的 RequestParam,这是行不通的。并且不可能将 RequestParam 作为它的 PARAMETER 目标。

@RequestParam <--This is not possible. 
public @interface QueryParam

那么还有其他方法可以实现吗?

最佳答案

基本上你想要实现的现在是不可能的,至少对于 Spring v 4.3.3 有两个主要问题,第一个是像 @RequestParam 这样的注释是用@Target(ElementType.PARAMETER) 这使得它无法用作元注释的一部分。此外,Spring MVC 使用不支持元注释或组合注释的 org.springframework.core.MethodParameter.getParameterAnnotations() 查找方法参数上的注释。但是如果你真的需要一些定制,你可以使用 HandlerMethodArgumentResolver 而不是元注释。

所以你的代码看起来像

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface QueryParam {

String name() default "";

boolean required() default false;

String defaultValue() default ValueConstants.DEFAULT_NONE;

}

然后使用 HandlerMethodArgumentResolver 添加您需要的自定义逻辑。

public class QueryParamResolver implements HandlerMethodArgumentResolver {

public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterAnnotation(QueryParam.class) != null;
}

public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
QueryParam attr = parameter.getParameterAnnotation(QueryParam.class);
// here you can use any logic which you need
return webRequest.getParameter(attr.value());
}
}

然后我们需要注册我们的HandlerMethodArgumentResolver

@Configuration
@EnableWebMvc
public class Config extends WebMvcConfigurerAdapter {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new QueryParamResolver());
}
}

最后让我们使用我们的自定义注释

 @GetMapping("/test")
public String test(@QueryParam("foo") String foo){
// something here
}

关于java - 带有目标的注释的 Spring aliasFor(参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38828543/

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