Java 是否有一步一步执行流程的模式/方式?

Java 是否有一步一步执行流程的模式/方式?,java,spring,Java,Spring,我有一个服务器端使用Java和Spring的应用程序。这个服务器有几个模块,其中一个负责一个进程的执行。模块中的一个有一个流程,该流程从一个端点开始,步骤很少 大概是这样的: @RestController @AllArgsConstructor @RequestMapping(value = "movie") public class MovieController { private final MovieService movieService; @GetMapping

我有一个服务器端使用Java和Spring的应用程序。这个服务器有几个模块,其中一个负责一个进程的执行。模块中的一个有一个流程,该流程从一个端点开始,步骤很少

大概是这样的:

@RestController
@AllArgsConstructor
@RequestMapping(value = "movie")
public class MovieController {

    private final MovieService movieService;

    @GetMapping("step1")
    public ResponseEntity step1() {
        return movieService.step1();
    }

    @GetMapping("step2")
    public ResponseEntity step2() {
        return movieService.step2();
    }

    @GetMapping("step3")
    public ResponseEntity step3() {
        return movieService.step3();
    }

    @GetMapping("step4")
    public ResponseEntity step4() {
        return movieService.step4();
    }

    @GetMapping("step5")
    public ResponseEntity step5() {
        return movieService.step5();
    }
}
如您所见,在本例中,每个步骤都可以从UI开始。但现在我需要添加从一个端点运行所有步骤的功能。所有步骤取决于上一步的状态,若上一步失败,则下一步永远不必启动。这就是为什么我在寻找执行所有步骤的最佳方法

我不喜欢这样:

@PostMapping("run")
public ResponseEntity runProcess() {
    movieService.step1();
    movieService.step2();
    movieService.step3();
    movieService.step4();
    return movieService.step5();
}
我想到了SpringBatch,我可以将
movieService
的每个方法分离到SpringBatch步骤,但是有什么意义吗


实现这些问题的正确方法是什么?

Spring MVC附带了
AbstractWizardFormController
类,可以轻松处理向导表单

:


您可以创建一个自定义异常,并在每个方法失败时抛出该异常。比如说

服务:

   public ResponseEntity step...() {
        if(failure){
          throw new CustomException("Error can't complete step 1");
        }
        return movieService.step1();
    }
public String runProcess() {
    try {
        movieService.step1();
        movieService.step2();
        movieService.step3();
        movieService.step4();
        movieService.step5();
    }catch(CustomException e){
      return e.getMessage();
    }

}
控制器:

   public ResponseEntity step...() {
        if(failure){
          throw new CustomException("Error can't complete step 1");
        }
        return movieService.step1();
    }
public String runProcess() {
    try {
        movieService.step1();
        movieService.step2();
        movieService.step3();
        movieService.step4();
        movieService.step5();
    }catch(CustomException e){
      return e.getMessage();
    }

}

我将使用一个类来嵌入逻辑。因此,您可以根据需要多次调用change state函数,还可以在模式中嵌入逻辑(“如果出现故障”)。

您可以从step1中调用step2,@Stultuske,我有一个接口
MovieService
,该接口具有所有步骤的方法。若我从上一步调用下一步,我将不需要所有方法的接口,因为所有方法都在一个类中,并且可以是私有的。在这种情况下会出现一个很大的私有方法调用链,对吗?我认为这不是一个好的解决方案。步骤1-4的结果是中间结果,对吗?然后,lambdas的生成器模式可能适用:。问题是您的方法返回类型(
ResponseEntity
)。这是表示层工作(即使对于rest服务也是如此),您不希望从其他服务调用表示层。最好返回一个POJO(普通Java对象),并让JSON映射逻辑将其转换为服务的表示格式——然后您还可以组合这些步骤,并从业务层的角度查看每个步骤的返回值。然后,如果失败,您应该向调用者返回更多详细信息,以便调用者可以重试自己失败的步骤。尝试实现Graphql,它可以从一个端点运行所有步骤-感谢resposne,抱歉,但我没有写我不使用JSP。UI是在AngularJS上实现的,它向服务器发送REST请求。