Custom Spring annotation for request parameters

23,480

As the guys said in the comments, you can easily write your annotation driven custom resolver. Four easy steps,

  1. Create an annotation e.g.

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UpperCase {
    String value();
}
  1. Write a resolver e.g.

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. register a resolver

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

or the java config

    @Configuration
    @EnableWebMvc
    public class Config extends WebMvcConfigurerAdapter {
    ...
      @Override
      public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
          argumentResolvers.add(new UpperCaseResolver());
      }
    ...
    }
  1. use an annotation in your controller method e.g.

public String test(@UpperCase("foo") String foo) 
Share:
23,480

Related videos on Youtube

arminas
Author by

arminas

Updated on July 01, 2020

Comments

  • arminas
    arminas almost 4 years

    I would like to write custom annotations, that would modify Spring request or path parameters according to annotations. For example instead of this code:

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

    I could make annotation @UpperCase :

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

    Is it possible and if it is, how could I do it ?

    • Sotirios Delimanolis
      Sotirios Delimanolis almost 9 years
      Look at the HandlerMethodArgumentResolver interface.
    • beerbajay
      beerbajay almost 9 years
      You can also do this with spring AOP; you'd use a method annotated like @Before("@annotation(my.pkg.annotation.UpperCase)"), then transform the parameter in the method.
  • wesker317
    wesker317 almost 9 years
    Shouldn't it be : <bean class="your.package.UpperCaseResolver"></bean> ?
  • hiway
    hiway almost 8 years
    this answer needs a relative high version of springframework. I tried 4.1.4,does not work, 4.2.4 can work.
  • Tushar Banne
    Tushar Banne over 6 years
    I created a custom annotation of my own. Used it in a sample application. It works fine. But when I tried to Integrate the same code with my project, it doesn't work. Not sure why is it not getting picked up
  • NickGreen
    NickGreen almost 6 years
    Works as expected in spring boot 1 with spring-web 4.3.14.RELEASE, thanks.
  • Martin van Wingerden
    Martin van Wingerden over 4 years
    Since Spring 5 you should just implement the interface WebMvcConfigurer instead of extending (the now deprecated) WebMvcConfigurerAdapter
  • tinker_fairy
    tinker_fairy over 4 years
    @master-slave i have used both the mvc:annotation/config but the custom resolver is not getting called in spring mvc project. It works in spring boot application. I dont know spring boot, is it related to spring boot?