RequestMapping存在多个参数之一

时间:2011-09-27 21:21:20

标签: spring-3 spring-annotations

我有一个Spring3控制器,我正在使用@RequestMapping注释。我知道我可以根据url参数的存在或缺少使用params值进行路由,但是有没有办法根据两个参数之一的路由进行路由?

理想情况下,我会有以下内容:

@RequestMapping(value="/auth", params="error OR problem")
public ModelAndView errorInAuthenticate()

如果存在参数错误或问题,我将路由到errorInAuthenticate。

5 个答案:

答案 0 :(得分:1)

不幸的是@RequestMapping参数使用AND组合,而不是OR。 (Source

答案 1 :(得分:1)

只需将两个参数映射为not required并测试它们:

@RequestMapping(value="/auth")
public ModelAndView errorInAuthenticate(@RequestParam(value="error", required=false) String errorParam, 
                                        @RequestParam(value="problem", required=false) String problemParam) {

    if(errorParam != null || problemParam != null) {
        //redirect
    }
}

答案 2 :(得分:0)

我认为你不能在@RequestMapping的'params'属性中做到这一点。我建议您为此编写一个过滤器,如果请求参数包含这些值中的任何一个,则重定向。

How do I map different values for a parameter in the same @RequestMapping in Spring MVC?

进行了讨论

答案 3 :(得分:0)

您可以使用此问题的答案

Multiple Spring @RequestMapping annotations

回答你的问题 - 只需添加多个RequestMapping,看看是否有效?

@RequestMapping(value="/auth", params="error")
@RequestMapping(value="/auth", params="problem")
public ModelAndView errorInAuthenticate()

答案 4 :(得分:0)

您可以使用Spring AOP进行操作,并为该请求映射创建周围的方面。

创建如下注释:

public @interface RequestParameterOrValidation{
    String[] value() default {};
}

然后,您可以使用它来注释您的请求映射方法:

@GetMapping("/test")
@RequestParameterOrValidation(value={"a", "b"})
public void test(
   @RequestParam(value = "a", required = false) String a, 
   @RequestParam(value = "b", required = false)  String b) {
      // API code goes here...
}

围绕注释创建一个方面。像这样:

@Aspect
@Component
public class RequestParameterOrValidationAspect {
    @Around("@annotation(x.y.z.RequestParameterOrValidation) && execution(public * *(..))")
    public Object time(final ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args= joinPoint.getArgs();

        MethodSignature methodSignature = (MethodSignature) thisJoinPoint.getStaticPart().getSignature();
        Method method = methodSignature.getMethod();
        Annotation[][] parameterAnnotations = method.getParameterAnnotations();
        RequestParameterOrValidation requestParamsOrValidation= method.getAnnotation(RequestParameterOrValidation.class);
        String[] params=requestParamsOrValidation.value();
        boolean isValid=false;
        for (int argIndex = 0; argIndex < args.length; argIndex++) {
            for (Annotation annotation : parameterAnnotations[argIndex]) {
                if (!(annotation instanceof RequestParam))
                    continue;
                RequestParam requestParam = (RequestParam) annotation;
                if (Arrays.stream(params).anyMatch(requestParam.value()::equals) && args[argIndex]!=null) {
                    // Atleast one request param exist so its a valid value
                    return joinPoint.proceed();
                }
            }
        }
       
        throw new IllegalArgumentException("illegal request");
    }
}

注意:-由于请求无效,因此在此处返回400 BAD REQUEST是一个不错的选择。当然,这取决于上下文,但这是从头开始的一般经验法则。