当前位置: 首页 > 知识库问答 >
问题:

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

东门翰
2023-03-14

我有两个控制器。两者都是映射后endpoint。

在第一个控制器(Controlller1)使所有我需要的对象,我想调用/重定向第二个控制器,以便继续,然后从它得到响应。

@RestController
public class Controller1{

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

       //here i would like to call second controller
    }
}
@RestController
public class Controller2{

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

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

我尝试过使用RestTemplate,但总是会出现405错误。我在某个地方读到,这是因为多部分

private ResponseEntity forwardUsingRestTemplate(HttpServletRequest httpServletRequest, Object object) throws MalformedURLException {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity req = new HttpEntity(object, headers);
        RestTemplate template = new RestTemplate();
        ResponseEntity<TdmResponse> response = template.exchange(getBaseUrl(httpServletRequest) + "/endpoint2", HttpMethod.POST, req, TdmResponse.class);
}

问题是,如何调用第二个endpoint?

共有3个答案

边银龙
2023-03-14

控制器用@RestController注释,这意味着从控制器方法返回的任何内容都将以json或xml的形式解释。在您的例子中,如果您从Controller1的doWhatController1HasToDo返回任何内容,它将以json或xml的形式处理。你应该用以下方法来做。这可能对你有帮助。

@Controller
public class Controller1{

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

   return "redirect:/doWhatController2HasToDo";
} }

我假设您的两个控制器都在同一个文件夹中(即Controller1和Controller2)。这将调用Controller2的方法doWhatController2HasToDo(@RequestBody Object request),您可以对该方法执行任何操作,如

@RestController
public class Controller2{

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

   return new ResponseEntity<>(JSON, HttpStatus.OK);
}
}
墨翔宇
2023-03-14

您也可以将第二个控制器注入到第一个控制器中,然后直接调用该方法。如果不想动态更改终结点,则可以这样做。

邹野
2023-03-14

为什么需要调用另一个endpoint?这些控制器在不同的应用中吗?

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

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);
    }
}

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

后期编辑:

您可以使用facade模式在控制器和服务之间添加另一层抽象:

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);
    }
}
 类似资料:
  • 我有一个简单的主: MainClassFXGUI.java 和三个fxml文件,其中一个包含其他两个文件 但是我有一个空指针异常,或者如果我移动handleButtonAction函数中对象'controller'实例化的代码,我没有任何错误,但是标签没有改变。 也许我可以在MainClassFXGUI.java中创建一个静态场景和一个静态阶段?但我不知道我该怎么用它们... MainClassF

  • 问题内容: 我试图通过使用变量在第一控制器中调用第二控制器的方法。这是我的第一个控制器中的一种方法: 我可以设置的值,但是由于某种原因我不能打电话。控制台显示此错误: TypeError:对象#没有方法’getMainCategories’ 有没有一种方法可以调用上述方法? 编辑: 我使用以下方法同时加载两个应用程序。 我肯定可以在这里使用服务,但我想知道是否还有其他选择可以这样做! 问题答案:

  • 我想在单击该按钮时从interface_pasienController上的Interface_adminController调用autoRefresh()方法。但是有一个错误“java.lang.NullPointerException”。代码怎么了? 线程“JavaFX Application thread”java.lang.RuntimeException中的异常:java.lang.Re

  • 我是JavaFx新手,因此我找不到解决问题的方法 假设我有以下应用程序结构: 在SecondController中显示文本的最佳/最佳方式是什么,从FirstController传递文本。我的意思是,我在中输入一个文本,然后按下按钮,按下按钮后,我希望文本显示在使用另一个控制器的中。我已经阅读了很多关于和可以用来解决这个问题的知识,但不幸的是,我无法实现一个有效的解决方案。 如果你们专家能在这方面

  • 需要你的帮助!这可能是更多的设计角度,但我在我的应用程序中使用这个模式,所以想得到一个想法。 我的问题是直接或间接地从一个控制器访问另一个控制器。是否有任何优雅的设计方法来做到这一点,而不是在另一个控制器中保留一个控制器的引用。 提前致谢

  • 我有两个控制器和。我正在读一本书的内容。来自的txt文件,我希望将该文本放置在的文本区域中。代码在中运行并读取良好,但当打开中的窗口时,从中读取的内容。文本内容在文本区域中不可见。我的显示String mine包含内容,但它不显示在的文本区域中。请帮助任何人。非常感谢。 FXMLDocumentController代码 在中,有一个我删除了和,这样代码就可以工作了。