3

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

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

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

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

4

3 回答 3

2

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

于 2012-10-26T18:50:04.963 回答
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
    }
}
于 2013-09-05T14:33:10.053 回答
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 将是一个不错的选择。当然,这取决于上下文,但这是一般的经验法则。

于 2020-09-07T07:51:02.540 回答