我有两个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);
}
}
问题是,我怎么称呼第二个端点?
答案 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);
}
}