【问题标题】:Redirect to a POST request from one controller to another controller Spring Boot重定向到从一个控制器到另一个控制器的 POST 请求 Spring Boot
【发布时间】:2021-12-20 07:03:48
【问题描述】:

我有一个带有 2 个控制器文件的 springboot 项目,如下所示:

File1.java
 @PostMapping("/test")
    public String testMap(String s){
         if(s!=null){
           return "found it";
         }
        else {
            // need to go to POST request in another controller
        }
        return "not found";
    }
File2.java
 @PostMapping("/test2")
    public String testMap2(String s){
         if(s!=null){
           return "found it";
         }
        return "not found 2";
    }

我尝试在 File1.java 中添加 java HttpURLConnection 行以发送 POST 请求,但它不执行 testMap2 内的操作,而是以 not found 退出

您能否就我如何做到这一点提出一些建议?

【问题讨论】:

  • 你试过使用rest模板吗? baeldung.com/rest-template
  • 这个意图听起来很奇怪。你有没有想过服务层?您可以将任何逻辑放入服务中,将其自动装配/注入到任意数量的控制器中并调用其方法
  • 将通用逻辑提取到@Service 中,并将其注入到两个控制器中。必须从一个控制器到另一个控制器进行 HTTP 调用是不好的做法。
  • @Ervin Szilagyi 谢谢,你能分享任何链接以供参考吗?

标签: java spring-boot spring-mvc httpurlconnection


【解决方案1】:

您可以使用RestTemplate 创建另一个 POST 请求,但我强烈建议避免这样做。

由于这两个控制器都在同一个项目中,请尝试将公共逻辑提取到应注入两个控制器中的@Service

例如:

文件1.java

@RestController
public class MyFirstController {
    private MyBusinessLogic myBusinessLogic;
 
    // Constructor injection
    public MyFirstController(MyBusinessLogic myBusinessLogic) {
        this.myBusinessLogic = myBusinessLogic;
    }
    
    @PostMapping("/test")
    public String testMap(String s){
         if(s!=null){
           return "found it";
         }
        else {
            return myBusinessLogic.doSomething(s);
        }
        return "not found";
    }
}

文件2.java:

@RestController
public class MySecondController {
    private MyBusinessLogic myBusinessLogic;
 
    // Constructor injection
    public MySecondController(MyBusinessLogic myBusinessLogic) {
        this.myBusinessLogic = myBusinessLogic;
    }

    @PostMapping("/test2")
    public String testMap2(String s){
         if(s!=null){
           return myBusinessLogic.doSomething(s);
         }
        return "not found 2";
    }
}

最后为通用逻辑创建一个服务:

@Service
public class MyBusinessLogic {
   public String doSomething(String s) {
      // common logic goes here
   }
}

【讨论】:

  • 非常感谢!这很有帮助。
【解决方案2】:

您可以使用 RestTemplate。

假设我们的控制器如下所示:

  @RestController
    @RequestMapping(value = "first/")
    public class FirstRestController {

         @PostMapping("test")
         public String getTest(String s){
       
            return service.doSomething(s);
         }
    }

基本上,将此方法作为 bean 添加到您的配置类之一中。 @Bean 将方法放在应用程序上下文中。现在我们可以在我们的服务中注入这个方法了。

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

现在,我们在 Second App 中的一个服务方法,我们必须调用 First 的端点。

@Service
public class SecondAppService{

  @Autowired
   private RestTemplate restTemplate;


   public String callFirst() {
      
   final URI uri =UriComponentsBuilder.fromUriString(PATH+"first/").toUri();
   restTemplate.postForEntity(uri, "something", String.class);
   // check your resttemplate docs, i used postForEntity here.

   // if necessery return something with response, this method expects the return string but you get the idea.
   }
}

这应该可行。

【讨论】:

    猜你喜欢
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    相关资源
    最近更新 更多