Java RestTemplate如何发布正文

Java RestTemplate如何发布正文,java,spring-boot,resttemplate,spring-restcontroller,Java,Spring Boot,Resttemplate,Spring Restcontroller,我需要一些帮助,以正确的方式在RestController中发布带有RestTemplate的json正文。我只是不太了解我做错了什么。我花了太多的时间研究这个问题,但我没有得到我需要的结果。希望我提供的信息是清楚的。现在我只是想把JSON主体发布到下面的URL API中 控制器 @RestController @RequestMapping("/api/feedback") public class FeedbackController { private final

我需要一些帮助,以正确的方式在RestController中发布带有RestTemplate的json正文。我只是不太了解我做错了什么。我花了太多的时间研究这个问题,但我没有得到我需要的结果。希望我提供的信息是清楚的。现在我只是想把JSON主体发布到下面的URL API中

控制器

@RestController
@RequestMapping("/api/feedback")
public class FeedbackController {

  private final RestTemplate restTemplate;

  @Autowired
  public FeedbackController(RestTemplate restTemplate) {
    this.restTemplate = restTemplate;
  }
  
  @RequestMapping(          
            method = RequestMethod.POST
            )
  public IncidentReport createIncident()      
  {  
      
    return restTemplate.exchange(
        "URL_API/create",
        HttpMethod.POST, null,
        new ParameterizedTypeReference<IncidentReport>(){}
                
    ).getBody();
  } 

exchange
是低级方法,更具体的方法通常更友好,只要它们涵盖您的用例。您正在查找
postForObject
postForEntity
,如果需要标题):


StackTrace会更有帮助。我认为您应该以下面的方式实例化RestTemplate

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder
            .setConnectTimeout(Duration.ofMillis(3000))
            .setReadTimeout(Duration.ofMillis(3000))
            .build();
}
然后在控制器类中自动连接它

 @Autowired
private RestTemplate myRestTemplate;

确保类路径中存在Jackson库。尝试使用myRestTemplate.postForObject()。这没什么大不了的。如果您仍然遇到问题,请尝试分析堆栈跟踪,您将得到一些提示。

因为spring boot自动配置
RestTemplate
ObjectMapper
@RestController
端点中进行序列化/反序列化,所以您根本不必坚持使用
RestTemplate
,并且可以使用以下代码片段中显示的功能:

@RestController
@RequestMapping("/api/feedback")
public class FeedbackController {

    @Autowired private FeedbackFacade feedbackFacade;

    @PostMapping("/")
    public ResponseEntity<IncidentReport> createIncidentReport(
            @RequestBody IncidentReport incidentReport)
    {
        log.info("Create incident report {}", incidentReport);
        var createdIncidentReport = feedbackFacade.create(incidentReport);
        log.info("Created incident report: {}", createdIncidentReport);
        return new ResponseEntity<>(createdIncidentReport, HttpStatus.CREATED)
    }
}
@RestController
@请求映射(“/api/feedback”)
公共类反馈控制器{
@自连线专用馈线;
@邮戳(“/”)
公共响应事件报告(
@请求主体意外事件报告(意外事件报告)
{
log.info(“创建事件报告{}”,incidentReport);
var createdIncidentReport=feedbackFacade.create(incidentReport);
log.info(“创建的事件报告:{}”,createdIncidentReport);
返回新的ResponseEntity(CreatedInCidEnterport,HttpStatus.CREATED)
}
}

你能添加你得到的输出/错误吗?@Thirumal它返回一个空记录:{}数组,就好像它没有接受帖子正文一样。如果我使用相同的JSON主体将API URL添加到postman中,它就可以正常工作。但是当我尝试使用我的请求映射POST calldumb问题时,这不起作用,但我的incidentObject会是什么…?@RobDePietro你说过你要使用
RestTemplate
发布一些东西。第一个参数是url第二个参数是Java对象映射自你的请求Json,你想发布第三个参数是你的响应类型期待接到电话service@chrylis-谨慎乐观-http post调用提供的post json post正文不是我的incidentObject吗?@RobDePietro您可能混淆了
RestTemplate
的角色吗?它的工作是让您对一些API进行HTTP调用;如果您正在处理传入的HTTP呼叫,那么这不是您需要的工具。
 @Autowired
private RestTemplate myRestTemplate;
@RestController
@RequestMapping("/api/feedback")
public class FeedbackController {

    @Autowired private FeedbackFacade feedbackFacade;

    @PostMapping("/")
    public ResponseEntity<IncidentReport> createIncidentReport(
            @RequestBody IncidentReport incidentReport)
    {
        log.info("Create incident report {}", incidentReport);
        var createdIncidentReport = feedbackFacade.create(incidentReport);
        log.info("Created incident report: {}", createdIncidentReport);
        return new ResponseEntity<>(createdIncidentReport, HttpStatus.CREATED)
    }
}