web-dev-qa-db-fra.com

Annotation Spring personnalisée pour les paramètres de demande

Je voudrais écrire des annotations personnalisées, qui modifieraient la demande de Spring ou les paramètres de chemin en fonction des annotations. Par exemple au lieu de ce code:

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

Je pourrais faire une annotation @UpperCase:

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

Est-ce possible et si c'est le cas, comment pourrais-je le faire?

23
arminas

Comme les gars l'ont dit dans les commentaires, vous pouvez facilement écrire votre résolveur personnalisé basé sur les annotations. Quatre étapes faciles,

  1. Créez une annotation, par exemple.

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UpperCase {
    String value();
}
  1. Écrivez un résolveur, par ex.

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. enregistrer un résolveur

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

ou la configuration Java

    @Configuration
    @EnableWebMvc
    public class Config extends WebMvcConfigurerAdapter {
    ...
      @Override
      public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
          argumentResolvers.add(new UpperCaseResolver());
      }
    ...
    }
  1. utilisez une annotation dans votre méthode de contrôleur, par ex.

public String test(@UpperCase("foo") String foo) 
38
Master Slave