3 回答
TA贡献1862条经验 获得超6个赞
您可以使用以下 2 种方式之一来执行此操作:
使用 Spring AOP 并为该请求映射创建一个环绕方面
使用 HandlerInterceptorAdapter 拦截给定 URI 的请求
1.使用Spring AOP
创建如下注释:
public @interface RequestParameterPairValidation {
}
然后你可以用它来注释你的请求映射方法:
@GetMapping("/test")
@RequestParameterPairValidation
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 RequestParameterPairValidationAspect {
@Around("@annotation(x.y.z.RequestParameterPairValidation) && execution(public * *(..))")
public Object time(final ProceedingJoinPoint joinPoint) throws Throwable {
Object[] requestMappingArgs = joinPoint.getArgs();
String a = (String) requestMappingArgs[0];
String b = (String) requestMappingArgs[1];
boolean requestIsValid = //... execute validation logic here
if (requestIsValid) {
return joinPoint.proceed();
} else {
throw new IllegalArgumentException("illegal request");
}
}
}
400 BAD REQUEST请注意,由于请求无效,因此返回此处是一个不错的选择。当然,这取决于上下文,但这是一般的经验法则。
2.使用HandlerInterceptorAdapter
创建一个新的拦截器映射到您想要的 URI(在本例中/test):
@Configuration
public class CustomInterceptor extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry
.addInterceptor(new CustomRequestParameterPairInterceptor())
.addPathPatterns("/test");
}
}
在自定义拦截器中定义验证逻辑:
public class CustomRequestParameterPairInterceptor extends HandlerInterceptorAdapter {
@Override
public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object obj, Exception exception) throws Exception {
}
@Override
public void postHandle(HttpServletRequest req, HttpServletResponse res, Object obj, ModelAndView modelAndView) throws Exception {
}
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
// Run your validation logic here
}
}
我会说第二个选项是最好的,因为您可以直接控制请求的答案。在这种情况下,它可能是 a400 BAD REQUEST或任何其他对您的情况更有意义的东西。
TA贡献1805条经验 获得超10个赞
您可以在这里以智能的方式使用 Optional,如下所示:
@GetMapping("/test")
@RequestParameterPairValidation
public void test(@RequestParam("a") Optional<String> a,
@RequestParam("b") Optional<String> b){
String aVal = a.isPresent() ? a.get() : null;
String bVal = b.isPresent() ? b.get() : null;
//go for service call here based on your logic
}
我希望这可以满足您的要求。
TA贡献1827条经验 获得超9个赞
您可以在 Spring 中使用 Java EE @Size Validation 注解(但您必须在类路径上有一个 Java EE 验证 API 实现器,即 hibernate )。使用休眠,您可以使用 maven 导入此依赖项
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.10.Final</version>
</dependency>
那么整个事情就变成了:
@RestController
@Validated
public class TestController {
@GetMapping("/test")
public void test(@RequestParam(value = "a", required = true ) @Size(min=1) String a,
@RequestParam(value = "b", required = true) @Size(min=1) String b) {
{
}
}
添加回答
举报