亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用對象作為參數從另一個控制器調用控制器并檢索響應

使用對象作為參數從另一個控制器調用控制器并檢索響應

隔江千里 2023-06-21 13:33:20
我有兩個休息控制器。兩者都是后映射端點。在第一個控制器 (Controller1) 使我需要的所有東西都成為一個對象之后,我想調用/重定向第二個控制器以便繼續,然后從它那里得到響應。@RestControllerpublic class Controller1{    @PostMapping("/endpoint1")    public ReponseEntity<?> doWhatController1HasToDo(@RequestBody Object request){       //some processing       //here i would like to call second controller    }}@RestControllerpublic 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);}問題是,我如何調用第二個端點?
查看完整描述

3 回答

?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

為什么需要調用另一個端點?這些控制器是否位于單獨的應用程序中?


如果不是,那么在這兩個控制器之上使用服務會更有效:


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 令牌。


稍后編輯:


您可以使用外觀模式在控制器和服務之間添加另一層抽象:


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

    }

}


查看完整回答
反對 回復 2023-06-21
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

您還可以將第二個控制器注入第一個控制器中,然后直接調用該方法。如果您不想動態更改端點,則此方法有效。



查看完整回答
反對 回復 2023-06-21
?
浮云間

TA貢獻1829條經驗 獲得超4個贊

您的控制器使用@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-06-21
  • 3 回答
  • 0 關注
  • 179 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號