当前位置: 首页 > 知识库问答 >
问题:

SpringBoot:使用RestTemplate调用查询

韩博厚
2023-03-14

我刚刚开始使用Spring Boot,我想使用RestTemplate调用一个查询并返回它的结果。

@Repository
public interface ApplicantRepository extends CrudRepository<Applicant, Integer> {

@Query("SELECT a FROM Applicant a WHERE a.propertyTypeId = :typeId" +
        " AND a.bedrooms = :bedrooms" +
        " AND a.budget = :price")
List<Applicant> findByMatchingCriteria(@Param("typeId")int typeId, @Param("bedrooms") int bedrooms,
                                      @Param("price") int price);
}
@RestController
public class MatchingController {

private RestTemplate restTemplate = new RestTemplate();

@RequestMapping(method = GET, value = "matchingByProperty/{propertyId}")
public List matchingByProperty(@PathVariable int propertyId) {
    Property property = restTemplate.getForObject("http://localhost:8080/api/properties/" + propertyId, Property.class);

    return restTemplate.getForObject("http://localhost:8080/api/applicants/search/findByMatchingCriteria?typeId=" + property.getTypeId()
                                            + "&bedrooms=" + property.getBedrooms()
                                            + "&price=" + property.getPrice(), List.class);
}
}
@Entity
public class Property {
private @Id @GeneratedValue int id;
private String fullAddress;
private int typeId;
private int subtypeId;
private int bedrooms;
private int price;

private Property() {}

public Property(String fullAddress, int typeId, int subtypeId, int bedrooms, int price) {
    this.fullAddress = fullAddress;
    this.typeId = typeId;
    this.subtypeId = subtypeId;
    this.bedrooms = bedrooms;
    this.price = price;
}
// getters and setters
}
exec-5] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP     message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
 at [Source: java.io.PushbackInputStream@3bd79387; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
 at [Source: java.io.PushbackInputStream@3bd79387; line: 1, column: 1]

如何使用RESTTemplate调用查询?还是有更好的办法做这件事?

共有1个答案

孙言
2023-03-14

如果只想从控制器调用自己的存储库,则不需要使用RestTemplate遍历HTTP。只需将存储库注入到您的控制器中,然后调用以下方法:

@RestController
public class MatchingController {

  @Autowired
  private ApplicantRepository applicantRepository;

  @RequestMapping(method = GET, value = "matchingByProperty/{propertyId}")
  public List matchingByProperty(@PathVariable int propertyId) {
    // You probably should not be going over HTTP for this either
    // and autowiring a property repository.
    Property property = restTemplate.
      getForObject("http://localhost:8080/api/properties/" + propertyId, Property.class);

    return applicantRepository.findByMatchingCriteria(property.getTypeId(), property.getBedrooms(), property.getPrice());
  }
}

如果出于某种原因想要查看HTTP,可以使用以下方法:Get list of JSON objects with Spring RestTemplate

 类似资料:
  • 如果需要从应用程序调用远程REST服务,可以使用Spring Framework的RestTemplate类。 由于RestTemplate实例在使用之前通常需要进行自定义,因此Spring Boot不提供任何单个自动配置的RestTemplate bean。 但是,它会自动配置RestTemplateBuilder,可用于在需要时创建RestTemplate实例。 自动配置的RestTempla

  • 尝试使用RestTemboard使用服务器证书作为要进行调用的客户端证书进行REST调用。 不要问我为什么:-),但我不想使用Apache的HttpClient。我只是觉得太过分了。 我见过一些代码,它们使用常规JDK的在系统范围内进行设置,即设置和调用如下代码所示: 然而,我在这里看到了GitHub的评论(https://github.com/spring-projects/spring-boo

  • 我正在发送API和接收状态代码400与我需要解析的正文 在使用RestTemplate时,我无法解析响应: 在这种情况下,我怎么还能得到正文/标题?我必须使用RestTemplate的替代方案吗? 此外,当我在内遇到捕获异常时,如何返回到请求上下文:

  • 我有一个springboot项目,它使用springboot RestTemplate。我们已经从1.5.3转移到了SpringBoot2.0.1,并且我们正在尝试通过使用WebClient将rest调用异步化。我们过去使用Resttemplate处理接收到的字符串,如下所示。但是WebClient只返回单点或通量数据。如何将数据作为字符串获取。已经尝试了block()方法,但它执行异步调用。 使

  • 试图调用返回简单json的restendpoint,但我总是失败。 结果是这样的: 我的代码是这样的:

  • 我在GET api中有多个查询参数(如姓名、年龄、性别、位置等…n个数字)。现在我需要使用这些查询值来查询我的mongo数据库。现在用户可以发送从0到n的查询参数。 我正在尝试使用类似的东西 或者 但问题是,考虑到用户可以发送的所有排列和组合,我将不得不编写多个查询。有没有更好的方法来做到这一点?