【问题标题】:Custom Spring annotation for request parameters请求参数的自定义 Spring 注解
【发布时间】:2015-08-23 07:11:01
【问题描述】:

我想编写自定义注解,根据注解修改 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";
}

有可能吗?如果可以,我该怎么做?

【问题讨论】:

  • HandlerMethodArgumentResolver界面。
  • 你也可以用spring AOP做到这一点;你会使用像@Before("@annotation(my.pkg.annotation.UpperCase)")这样注释的方法,然后在方法中转换参数。

标签: java spring spring-mvc spring-annotations request-mapping


【解决方案1】:

正如 cmets 中的人所说,您可以轻松编写注释驱动的自定义解析器。四个简单的步骤,

  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) 

【讨论】:

  • 不应该是: ?
  • 这个答案需要相对高版本的springframework。我试过4.1.4,不行,4.2.4可以。
  • 我自己创建了一个自定义注释。在示例应用程序中使用它。它工作正常。但是当我尝试将相同的代码与我的项目集成时,它不起作用。不知道为什么它没有被捡起
  • 从 Spring 5 开始,您应该只实现接口 WebMvcConfigurer 而不是扩展(现已弃用)WebMvcConfigurerAdapter
  • @master-slave 我同时使用了 mvc:annotation/config 但是自定义解析器没有在 spring mvc 项目中被调用。它适用于 Spring Boot 应用程序。不知道spring boot,和spring boot有关系吗?
猜你喜欢
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 2013-07-13
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多