spring Java -ResponseEntity作为响应的反序列化问题

mum43rcc  于 2023-08-02  发布在  Spring
关注(0)|答案(2)|浏览(234)

我正在尝试在单独的应用程序中为其设置存根端点和调用者。根据设计,端点需要返回一些非常简单的东西-非常基本的响应,状态码为200或500 -不需要额外的响应对象。当前端点的调用者抛出下面的错误。现在说端点将返回什么类型的MediaType还为时过早,但目前我将其设置为json,如下所示:
错误:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of org.springframework.http.ResponseEntity (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

字符串
端点定义:

@POST
    @Path("/runtest")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    ResponseEntity runtest(MyRequestObject obj);


和存根端点实现:

public ResponseEntity runtest(MyRequestObject obj) {
        return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).build();
    }


使用端点的单独应用程序中的调用方代码:

public ResponseEntity runtest(MyRequestObject obj) {
        return service.runtest(obj);
    }


当我只使用Postman到达端点时,我得到了我所期望的结果,没有任何错误:

{
    "headers": {...},
    "body": null,
    "statusCodeValue": 200,
    "statusCode": "OK"
}


以下是我希望解决的问题:

  • 有没有一种简单的方法可以让上面的工作,而不附加一个DTO对象到ResponseEntity?答案必须非常基本。
  • 我宁愿不为ResponseEntity设置MediaType,但在我看来,我必须让它匹配端点的定义。

非常感谢您的投入和时间。

zqdjd7g9

zqdjd7g91#

为了修复反序列化错误,返回这个自定义Json对象Cancellation而不是ResponseEntity:

@POST
    @Path("/runtest")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    Cancellation runtest(MyRequestObject obj);

字符串

mxg2im7a

mxg2im7a2#

您遇到的错误与从调用方应用程序中的存根端点接收的响应的反序列化过程有关。由于存根端点返回一个没有主体的简单ResponseEntity,因此反序列化过程会失败,因为ResponseEntity中没有可供Jackson用于构造示例的默认构造函数。
要解决此问题并返回基本响应而不将DTO对象附加到ResponseEntity,您可以修改存根端点实现并将返回类型更改为ResponseEntity。这样,您就显式地指定响应没有主体。
下面是存根端点的更新版本:

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {
    
    @PostMapping("/runtest")
    public ResponseEntity<Void> runtest(@RequestBody MyRequestObject obj) {
        return ResponseEntity.ok().build();
    }
    
}

字符串
通过使用ResponseEntity,您指示响应没有正文内容。您可以删除内容类型规范,因为您不需要为空响应指定媒体类型。

相关问题