从另一个控制器以对象为参数调用控制器并检索响应

时间:2019-08-27 11:03:19

标签: java spring spring-boot

我有两个restcontrollers。两者都是后映射端点。

在第一个控制器(Controller1)使我需要的所有对象成为对象之后,我想调用/重定向第二个控制器以继续进行操作,然后从中获得响应。

UserInfo
@RestController
public class Controller1{

    @PostMapping("/endpoint1")
    public ReponseEntity<?> doWhatController1HasToDo(@RequestBody Object request){
       //some processing

       //here i would like to call second controller
    }
}

我尝试使用RestTemplate,但始终会出现405错误。我在某处读过书,那是因为有多篇文章

@RestController
public class Controller2{

    @PostMapping("/endpoint2")
    public ReponseEntity<?> doWhatController2HasToDo(@RequestBody Object request){
       //some processing

       return new ResponseEntity<>(JSON, HttpStatus.OK);
    }
}

问题是,我怎么称呼第二个端点?

3 个答案:

答案 0 :(得分:0)

您为什么需要呼叫另一个端点?这些控制器是否在单独的应用程序中?

如果不是,那么在这两个控制器之上使用服务会更有效:

public class Service {

 public Object processController1(Object object) {
 //some processing
 return processController2(result of some processing);
 }

 public Object processController2(Object object) {
 // processing
 }

}

然后在您的控制器中使用以下两种方法:

public class Controller1{

    private Service service;

    public ReponseEntity<?> doWhatController1HasToDo(@RequestBody Object request){
       return new ResponseEntity<>(service.processController1(request), OK);
    }
}
public class Controller2{

    private Service service;

    public ReponseEntity<?> doWhatController1HasToDo(@RequestBody Object request){
       return new ResponseEntity<>(service.processController2(resultProcess1), OK);
    }
}

如果有2个不同的应用程序,那么问题可能出在CSRF设置上。如果在第二个应用程序中启用了CSRF,则它将拒绝您的呼叫,因为您没有通过RestTemplate传递CSRF令牌。

以后编辑:

您可以使用外观模式在Controller和Services之间添加另一层抽象:

public class Facade{

    private Service1 service1;
    private Service2 service2;

    public ReponseEntity<?> doWhatController1HasToDo(@RequestBody Object request){
       Object resultService1 = service1.process(request);
       Object resultService2 = service2.process(resultService1);
       return new ResponseEntity<>(resultService2, OK);
    }

    public ReponseEntity<?> doWhatController2HasToDo(@RequestBody Object request){
       Object resultService2 = service2.process(request);
       return new ResponseEntity<>(resultService2, OK);
    }
}

答案 1 :(得分:0)

您还可以将第二个控制器注入第一个控制器,然后直接调用该方法。如果您不想动态更改端点,则可以使用此功能。

答案 2 :(得分:0)

您的控制器带有 @RestController 注释,这意味着从控制器方法返回的任何内容均以json或xml的形式解释。在您的情况下,如果您从Controller1的 doWhatController1HasToDo 返回任何内容,它将把它作为json或xml处理。您应该按照以下方式进行操作。可能会对您有帮助。

@Controller
public class Controller1{

@PostMapping("/endpoint1")
public String doWhatController1HasToDo(@RequestBody Object request){
   //some processing

   return "redirect:/doWhatController2HasToDo";
} }

我假设您的两个Controller都在同一文件夹(即Controller1和Controller2)中。这将调用Controller2的方法 doWhatController2HasToDo(@RequestBody对象请求),您可以在此方法中做任何事情,例如

@RestController
public class Controller2{

@PostMapping("/endpoint2")
public ReponseEntity<?> doWhatController2HasToDo(@RequestBody Object request){
   //some processing

   return new ResponseEntity<>(JSON, HttpStatus.OK);
}
}