我如何减少Spring Boot控制器中的重复代码

时间:2018-11-02 08:46:27

标签: java spring spring-boot

我刚刚开始将spring boot用于我的服务。我很少有在其体内使用相同代码的控制器。例如,在每个控制器中,我必须检查从请求获得的请求对象是否为空:

if (request == null){
    throw new InvalidRequestException("the request object is null");
}

我知道在多个控制器中重复执行代码不是一种好方法,所以我想知道是否有一种方法可以防止代码重复,或者spring boot是否可以解决上述问题。

8 个答案:

答案 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 有效负载。 @有效检查有效内容。一旦收到没有必填字段的有效负载,就可以使用错误处理情况。