您可以使用 Spring AOP 模块。而且我认为一种干净的方式(在不中断 RestController 端点流的情况下管理响应)可以如下。
首先添加spring-boot-starter-aop依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
让我们看看代码。
这是我们的ExampleRequest
import lombok.Data;
@Data
public class ExampleRequest {
String name;
}
我们假设我们想要验证我们的请求 -> 如果 name == "anonymous" 我们想要返回一个 HTTP 状态 BAD_REQUEST。
这是我们的TestController
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@Anonymous
@GetMapping("")
public ResponseEntity<String> test(ExampleRequest exampleRequest, BindingResult bindingResult) {
if (bindingResult.hasErrors()) return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
else return new ResponseEntity<>(HttpStatus.OK);
}
}
我们将ExampleRequest 和BindingResult 作为参数传递,这是我们的请求,我们将在稍后使用。无论如何,如果 bindingResult 有错误,我们的验证逻辑就会被破坏,所以我们需要返回我们想要的错误!
@Anonymous 是我们的自定义注解,我们将使用它来告诉我们的 Advice 哪些方法,或者更好 - 哪些类(Aspect 是一个“代理”的整个类),我们想代理
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Anonymous {
}
还有我们的TestAspect
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;
@Aspect
@Component
public class TestAspect {
@Before(value = "@annotation(Anonymous) && args(exampleRequest, bindingResult,..)", argNames = "joinPoint,exampleRequest,bindingResult")
public Object logExecutionTime(JoinPoint joinPoint, ExampleRequest exampleRequest, BindingResult bindingResult) throws Throwable {
if (exampleRequest.getName().equals("anonymous")) bindingResult.rejectValue("name", "incorrect");
return joinPoint;
}
}
我们的意思是:之前执行EVERY METHODS用我们的自定义ANONYMOUS注释和这些ARGUMENTS注释> 执行这个逻辑!
显然,您将拥有自定义的验证逻辑,因此请实施它。
正如我在上面的 cmets 中所说,我认为您可以直接从代理类返回错误,但同时我认为这个示例是使用 AOP 的一种更简洁的方式(使用 BindingResult,端点的流受到尊重,这技术不会破坏模型类的其他验证。您可以使用 javax 验证,例如混合建议,一切都会完美运行!),我个人喜欢这个 Spring AOP 模块,但不要滥用它嗯>!
供参考:https://docs.spring.io/spring/docs/2.5.x/reference/aop.html