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

使用resttemplate从另一个服务获取数据时postman出错

越季萌
2023-03-14

在使用RestTemplate从另一个服务获取数据时,我在postman中出错。

我有两种服务。第一个服务有userdetails实体类,第二个服务有posts实体类。这是邮局管理员的代码。

@GetMapping("/findpostbyareacode/{areacode}")
List<Posts> getPostByAreacode(@PathVariable(value="areacode") Long areacode){

    RestTemplate restTemplate=new RestTemplate();

    ResponseEntity<List<UserDetails>> response= 
            restTemplate.exchange("http://localhost:8091/voiceofbengal/userdetailsbyareacode/"+areacode, HttpMethod.GET,
                    null, new ParameterizedTypeReference<List<UserDetails>>(){

    });

    List<UserDetails> body=response.getBody();
    List<Posts> postList=new ArrayList<>();
    List<Posts> totalPost=new ArrayList<>();
    for(UserDetails users : body) {
        totalPost=postService.findByU_id(users.getU_id());
        for(Posts posts : totalPost) {
            postList.add(posts);
        }
    }

    return postList;

}

我在《邮递员》中看到了这个错误。

"timestamp": "2019-01-17T09:10:32.977+0000",
"status": 500,
"error": "Internal Server Error",
"message": "Error while extracting response for type [java.util.List<com.css.vob.model.UserDetails>] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.util.Date` from String \"01-01-1990\": not a valid representation (error: Failed to parse Date value '01-01-1990': Cannot parse date \"01-01-1990\": not compatible with any of standard forms (\"yyyy-MM-dd'T'HH:mm:ss.SSSZ\", \"yyyy-MM-dd'T'HH:mm:ss.SSS\", \"EEE, dd MMM yyyy HH:mm:ss zzz\", \"yyyy-MM-dd\")); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String \"01-01-1990\": not a valid representation (error: Failed to parse Date value '01-01-1990': Cannot parse date \"01-01-1990\": not compatible with any of standard forms (\"yyyy-MM-dd'T'HH:mm:ss.SSSZ\", \"yyyy-MM-dd'T'HH:mm:ss.SSS\", \"EEE, dd MMM yyyy HH:mm:ss zzz\", \"yyyy-MM-dd\"))\n at [Source: (PushbackInputStream); line: 1, column: 57] (through reference chain: java.util.ArrayList[0]->com.css.vob.model.UserDetails[\"dob\"])",

编辑-尝试@Pijotrek的解决方案后,我现在得到这个错误。

"message": "could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet"

这是我的实体类、DAO和JPARepository

这是UserDetails的实体类

这是我一直从后控制器调用的用户详细信息的控制器方法-

    @GetMapping("/userdetailsbyareacode/{areacode}")
public ResponseEntity<List<UserDetails>> getUserByAreacode(@PathVariable(value="areacode") Long areacode){
    List<UserDetails> user=userdetailsService.getuserByAreacode(areacode);

    if(user==null) {
        return ResponseEntity.notFound().build();
    }
    return ResponseEntity.ok().body(user);
}

这是邮局管理员的建议-

public interface PostRepository extends JpaRepository<Posts,Long> {

@Transactional
@Query(nativeQuery=true,value="SELECT * FROM POSTS WHERE U_ID=:u_id")
List<Posts> findPostsByU_id(@Param("u_id") Long u_id);

共有1个答案

钱振
2023-03-14

您在请求中发送了一个包含一些用户详细信息的正文。

ResponseEntity<List<UserDetails>> response= restTemplate.exchange("http://localhost:8091/voiceofbengal/userdetailsbyareacode/"+areacode, HttpMethod.GET,
null, new ParameterizedTypeReference<List<UserDetails>>(){
});

读取错误时,我假设您的UserDetails类有一个名为dob的字段。您在控制器类中访问的REST API(顺便说一句,这是一种不好的做法)尝试转换dob字段,并得到一个异常,因为它不是以任何可接受的格式编写的。可接受的格式为:(“yyyy-MM-dd'T'HH:MM:ss.SSSZ\”、“yyy-MM-dd'HH:MM:ss.SSS\”、“EEE,dd-MMM-yyyy-HH:MM:ss-zzz\”、“yyy-MM-dd\”) 。都在你的错误信息里。因此,将你的dob格式设置为“1990-01-01T10:00:00.000Z”“1990-01-01”,应该可以正常工作。

或者,如果您控制您在Controller中调用的REST API,您可以使用@DateTimeFormat注释来匹配您目前发送的格式,即:@DateTimeFormat(模式="dd-MM-yyyy")

您的返回类型不适合执行本机查询。无论如何,您不必使用它,您可以将方法名称更改为以下内容:

@Transactional
List<Posts> findPostsByUserId(Long id);

这就应该奏效了

 类似资料:
  • 我正在为我的API使用Spring Boot。我正在重写我的API,以采用微服务体系结构。 我有两门课: 1) 产品 2) 配料 我的代码: 以下是我的产品类别: 这是我的配料课: 在产品微服务中,我正在对成分微服务进行API调用: 但是,上面的getComponents()方法不起作用。 我的问题: 我想从Component microservice获取数据,但是,出现以下错误: “错误”:“内

  • 我想知道你是否能帮忙。我正在编写一个订单系统,目前已经实现了一个订单微服务来处理下订单。我正在使用DDD与事件源和CQRS。 订单服务本身接收生成事件的命令,实际的订单服务侦听自己的事件以创建读取模型(这里的想法是使用CQR,因此用于写入的命令和用于读取的查询) 在执行上述操作后,我遇到了一个问题,可能只是我没有完全理解正确的方法。 一个订单实际上有依赖项,这意味着一个订单需要一个客户和一个产品。

  • 问题内容: 我需要从一些在线资源中获取时间- NTP服务器,JSON时间服务器,或者可能只是HTTP标头。我不在乎精度,但是我确实需要从在线资源中获取时间。我无权访问任何服务器,因此无法编写任何服务器端代码。 我无法使用HTTP请求来获取标头,因为我猜这将违反相同的原始策略。 而且我似乎找不到一种不涉及某些级别的PHP或其他语言的方法-我只能使用HTML / CSS / JS …没别的! 有任何想

  • 问题内容: 我试图使用Angular从远程WS以Json格式获取数据,但遇到了一些麻烦。数据正确地来自Web服务,但是我不能在控制器内部使用它。这是为什么?角度代码: HTML: 问题答案: 您应该将$ http.get放入控制器中。 而且,Web服务返回的对象不是数组。因此,您的ng-repeat应该是这样的: 这是一个工作示例:

  • 各位专家下午好, 我需要调用3个REST API的顺序调用,作为单个客户机调用GET/offers的一部分,以检索百货公司不同通道中每种产品的可用报价,如下所示 然后在循环中检索每个并调用第二个API以获得产品 然后在循环中检索每个并调用第三个API以获得提供 最后,整理所有的响应,将报价列表发送给客户。

  • 我得到了错误: 06-24 10:41:36.497 173 16-17316/com.example.waseem.geolocation:location_service e/androidruntime:致命异常:main process:com.example.waseem.geolocation:location_service,pid:17316 java.lang.runtimeEx