我刚刚开始将spring boot用于我的服务。我很少有在其体内使用相同代码的控制器。例如,在每个控制器中,我必须检查从请求获得的请求对象是否为空:
if (request == null){
throw new InvalidRequestException("the request object is null");
}
我知道在多个控制器中重复执行代码不是一种好方法,所以我想知道是否有一种方法可以防止代码重复,或者spring boot是否可以解决上述问题。
答案 0 :(得分:4)
您正在使用SpringBoot,因此在您的应用程序中定义@SpringBootApplication
注释的地方,可以指定下一个@Bean
:
@Bean
public HttpRequestHandler httpRequestHandler () {
return new MyHttpRequestHandler();
}
还创建MyHttpRequestHandler
类,您可以在其中创建任何逻辑:
public class MyHttpRequestHandler implements HttpRequestHandler {
@Override
public void handleRequest (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (request == null) {
throw new InvalidRequestException("the request object is null");
}
}
}
答案 1 :(得分:1)
基本上,您正在做的是参数验证。这是一种横切关注点,是使用AOP方法的完美用例。
Spring提供了很好的方法
您可以像这样简单地使用@validate
@PostMapping
public ResponseEntity<Void> someMEthod(@Validated(CustomChecks.class) @RequestBody request yourRequest)
然后,您可以将所有验证逻辑放入CustomChecks类中。 (您可以找到许多示例)
如果您的验证非常小而通用,那么您也可以使用注释。
在您的情况下,只需在请求类上添加 @NotNull 批注。选中此example
希望这会有所帮助
答案 2 :(得分:0)
只需将代码包装在方法中即可
protected void checkRequest(Object request){
if (request == null){
throw new InvalidRequestException("the request object is null");
}
}
并在AbstractController
类中声明它。让您的控制器扩展此类。
答案 3 :(得分:0)
使服务层根据您的条件引发自定义异常,并在引发异常时在Controller中使用@ControllerAdvice处理输出。
答案 4 :(得分:0)
一种方法是创建一个抽象类,该抽象类将包含将由扩展控制器调用的包装方法。
public abstract class CoreController {
protected void validateRequest(MyRequest request) {
if (request == null) throw new InvalidRequestException("the request object is null");
}
}
使用此类扩展您的控制器,然后调用validateRequest
方法
public class MyController extends CoreController {
@PostMapping("/some_endpoint")
public MyResponse endpointMethod (@RequestBody MyRequest request) {
validateRequest(request);
...
return new MyResponse();
}
}
答案 5 :(得分:0)
春季AOP吗?
创建这样的Aspect类:
@Aspect
class AopDemo{
@Around("execution(* com.demo.controller.*(..))")
public Object release(JoinPoint jp){
try{
Object[] args = jp.getArgs();
for(Object arg: args){
if(arg == null){
throw new InvalidRequestException("the request object is null");
}
}
return jp.proceed(args);
}catch(InvalidRequestException ire){
// handle InvalidRequestException
}catch(Exception ex){
// handle Exception
}
}
}
答案 6 :(得分:0)
我同意@Niraj Sonawane使用@Validated批注处理帖子中给出的特定情况。
此外,使用过滤器可能是处理“执行先决条件”事件的另一种选择。我们使用复杂的逻辑来解决设计中所有控制器所需的访问权限。而且,我们使用过滤器来处理。
答案 7 :(得分:0)
最好使用 @有效来检查有效负载,而无需手动检查。请按照以下说明进行操作。
您可以使用“ 导入org.springframework.validation.Errors; ”和 @Valid ,如下所示。
import {Component, OnInit, Inject, HostListener} from '@angular/core';
import { DOCUMENT } from "@angular/platform-browser";
import { BrowserModule } from '@angular/platform-browser';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'Hard Hitter@Cool';
navIsFixed: boolean;
constructor(@Inject(DOCUMENT) private document: Document){
}
@HostListener("window:scroll", [])
onWindowScroll() {
if (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop > 100) {
this.navIsFixed = true;
} else if (this.navIsFixed && window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop < 10) { this.navIsFixed = false; } } scrollToTop() { (function smoothscroll() { var currentScroll = document.documentElement.scrollTop || document.body.scrollTop; if (currentScroll > 0) {
window.requestAnimationFrame(smoothscroll);
window.scrollTo(0, currentScroll - (currentScroll / 5));
}
})();
}
}
您可以按以下方式验证的人员有效载荷。
@PostMapping("/test")
public ResponseEntity<String> editStatus(@Valid @RequestBody Person person, Errors errors) {
String responseMessage;
if(errors.hasErrors()) {
responseMessage = "'" + errors.getFieldError().getField() + "' " + errors.getFieldError().getDefaultMessage();
} else {
// You can do ur logic here
responseMessage = "result";
}
return ResponseEntity.accepted().body(responseMessage);
}
在此说明中,我使用了 Person 有效负载。 @有效检查有效内容。一旦收到没有必填字段的有效负载,就可以使用错误处理情况。