我有一个Spring3控制器,我正在使用@RequestMapping注释。我知道我可以根据url参数的存在或缺少使用params值进行路由,但是有没有办法根据两个参数之一的路由进行路由?
理想情况下,我会有以下内容:
@RequestMapping(value="/auth", params="error OR problem")
public ModelAndView errorInAuthenticate()
如果存在参数错误或问题,我将路由到errorInAuthenticate。
答案 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是一个不错的选择。当然,这取决于上下文,但这是从头开始的一般经验法则。