重定向到从一个控制器到另一个控制器的 POST 请求 Spring 启动
Redirect to a POST request from one controller to another controller Spring Boot
我有一个带有 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";
}
我尝试添加 java HttpURLConnection
行以在 File1.java 中发送 POST 请求,但它不执行 testMap2
中的操作,而是它以 not found
退出
你能给我一些建议吗?
您可以使用 RestTemplate
创建另一个 POST 请求,但我强烈建议避免这样做。
由于这两个控制器都在同一个项目中,请尝试将通用逻辑提取到一个 @Service
中,应该将其注入到两个控制器中。
例如:
File1.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";
}
}
File2.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
}
}
您可以使用 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.
}
}
这应该有效。
我有一个带有 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";
}
我尝试添加 java HttpURLConnection
行以在 File1.java 中发送 POST 请求,但它不执行 testMap2
中的操作,而是它以 not found
你能给我一些建议吗?
您可以使用 RestTemplate
创建另一个 POST 请求,但我强烈建议避免这样做。
由于这两个控制器都在同一个项目中,请尝试将通用逻辑提取到一个 @Service
中,应该将其注入到两个控制器中。
例如:
File1.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";
}
}
File2.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
}
}
您可以使用 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.
}
}
这应该有效。