我有两个控制器。两者都是映射后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?
控制器用@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);
}
}
您也可以将第二个控制器注入到第一个控制器中,然后直接调用该方法。如果不想动态更改终结点,则可以这样做。
为什么需要调用另一个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代码 在中,有一个我删除了和,这样代码就可以工作了。