自定义Spring注释用于请求参数

28

我希望编写自定义注释,根据注释修改Spring请求或路径参数。例如,代替这段代码:

@RequestMapping(method = RequestMethod.GET)
public String test(@RequestParam("title") String text) {
   text = text.toUpperCase();
   System.out.println(text);
   return "form";
}

我可以进行注释 @UpperCase :

@RequestMapping(method = RequestMethod.GET)
   public String test(@RequestParam("title") @UpperCase String text) {
   System.out.println(text);
   return "form";
}

这是否可能,如果是的话,我该如何做到?


3
请查看 HandlerMethodArgumentResolver 接口。 - Sotirios Delimanolis
你也可以使用Spring AOP来实现这个功能;你需要使用一个被注解为@Before("@annotation(my.pkg.annotation.UpperCase)")的方法,然后在该方法中转换参数。 - beerbajay
1个回答

49

正如评论中的人所说,您可以轻松编写基于注释的自定义解析器。只需四个简单步骤,

  1. 创建一个注释,例如:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UpperCase {
    String value();
}
  1. 编写一个解析器,例如
public class UpperCaseResolver implements HandlerMethodArgumentResolver {

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

    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
            WebDataBinderFactory binderFactory) throws Exception {
        UpperCase attr = parameter.getParameterAnnotation(UpperCase.class);
        return webRequest.getParameter(attr.value()).toUpperCase();
    }
}
  1. 注册解析器

<mvc:annotation-driven>
        <mvc:argument-resolvers>
            <bean class="your.package.UpperCaseResolver"></bean>
        </mvc:argument-resolvers>
</mvc:annotation-driven>

或者Java配置

    @Configuration
    @EnableWebMvc
    public class Config extends WebMvcConfigurerAdapter {
    ...
      @Override
      public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
          argumentResolvers.add(new UpperCaseResolver());
      }
    ...
    }
  1. 在您的控制器方法中使用注释,例如:

public String test(@UpperCase("foo") String foo) 

难道不应该是:<bean class="your.package.UpperCaseResolver"></bean> 吗? - wesker317
1
这个答案需要一个相对较高版本的Spring框架。我尝试了4.1.4,但不起作用,4.2.4可以工作。 - hiway
我创建了一个自定义注解。在一个示例应用程序中使用它,它可以正常工作。但是当我尝试将相同的代码集成到我的项目中时,它无法正常工作。不确定为什么它没有被识别。 - Tushar Banne
在Spring Boot 1中与Spring-Web 4.3.14.RELEASE一起正常工作,谢谢。 - NickGreen
1
自Spring 5开始,您应该只实现接口WebMvcConfigurer,而不是继承(现已弃用的)WebMvcConfigurerAdapter - Martin van Wingerden
1
@master-slave 我在Spring MVC项目中使用了mvc:annotation/config,但自定义解析器没有被调用。它在Spring Boot应用程序中可以工作。我不知道Spring Boot,它是否与Spring Boot有关? - tinker_fairy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接