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

一种使用Postman多态HTTP请求的方法?

呼延卓
2023-03-14

我试图利用Java多态性。我用Spring Boot构建了一个简单的CRUD应用程序,我想用Postman测试它...

问题是,我有下一个例外:

WARN 4576--[nio-8080-exec-2].w.s.m.s.DefaultHandlerExceptionResolver:Resolved[org.springframework.http.converter.httpMessageNodeAbleException:JSON解析错误:无法解析[simple type,class.com.shoppingprojectwithhibernate.PromotionsModule.Domain.Promotions]的子类型:缺少类型id属性“PromotionSeason”(用于POJO属性“PromotionSeason”);嵌套异常是com.fasterxml.jackson.databind.exc.invalidTypeIdeException:无法解析[simple type,class com.balabasciuc.shoppingprojectwithhibernate.PromotionModule.Domain.Promotion Season]的子类型:缺少类型id属性“PromotionSeason”(用于POJO属性“PromotionSeason”)

当我尝试向endpoint发出POST请求时,该endpoint返回一个接口,并且在运行时可以是任何子类型,我在这里滚动了解决方案,我使用了杰克逊从其他解决方案中使用的解决方案,但到目前为止没有一个对我有效,你能给我一个提示吗?

my interface:

    import com.fasterxml.jackson.annotation.JsonSubTypes;
    import com.fasterxml.jackson.annotation.JsonTypeInfo;
    
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "promotionSeason")
    @JsonSubTypes(
            {
                    @JsonSubTypes.Type(value = PromotionChristmasSeason.class, name = "christmasPromotion"),
                  @JsonSubTypes.Type(value = PromotionEasterSeason.class, name = "easterPromotion"),
                    @JsonSubTypes.Type(value = NoPromotionForYouThisTimeMUHAHA.class, name = "noPromotion")
            })
    public interface PromotionSeason {
    
        String isSeason();

Interface subtype:
    @JsonTypeName(value = "noPromotion")
    public class NoPromotionForYouThisTimeMUHAHA implements PromotionSeason {
    



Promotion class Entity constructor:
    public Promotion(int numberOfProductsAtPromotion, PromotionSeason promotionSeason) {
        this.numberOfProductsAtPromotion = numberOfProductsAtPromotion;
        this.promotionSeason = promotionSeason;
    }

Rest Controller class

@RestController
@RequestMapping(value = "/promotions")
public class PromotionController {

    @PostMapping(value = "/createPromotion")
    public ResponseEntity<String> createPromotion(@RequestBody Promotion promotion)
    {
        promotionService.createPromotion(promotion);
        return ResponseEntity.status(HttpStatus.CREATED)
                .body("Done");
    }
    
    Postman request:
    {
        "numberOfProductsAtPromotion" : 20,
        "promotionSeason" : "noPromotion"
    }
    
    Postman response:
    {
        "timestamp": "2022-05-04T18:58:06.873+00:00",
        "status": 400,
        "error": "Bad Request",
        "path": "/promotions/createPromotion"
    }
    
    Spring Response:
    2022-05-04 21:19:44.374  WARN 4576 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Could not resolve subtype of [simple type, class com.shoppingprojectwithhibernate.PromotionsModule.Domain.PromotionSeason]: missing type id property 'promotionSeason' (for POJO property 'promotionSeason'); nested exception is com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type, class com.balabasciuc.shoppingprojectwithhibernate.PromotionsModule.Domain.PromotionSeason]: missing type id property 'promotionSeason' (for POJO property 'promotionSeason')<EOL> at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 3, column: 25] (through reference chain: com.shoppingprojectwithhibernate.PromotionsModule.Domain.Promotion["promotionSeason"])]

共有2个答案

鲁鸿
2023-03-14

这一直是我糟糕的发帖请求,而不是:

邮递员请求:

{
    "numberOfProductsAtPromotion" : 20,
    "promotionSeason" : "noPromotion"    }

它应该是:

{
    "numberOfProductsAtPromotion" : 20,
    "promotionSeason" : { // "promotionSeason" is class instance var from Promotion Entity class
        "promotionSeason" : "noPromotion" // "promotionSeason" is defined on interface level: `@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "promotionSeason")`
         //"noPromotion" is defined on interface and subtype levels
        //any more subtype(subclass) variables to init if any
    }

检查此项:https://www.youtube.com/watch?v=IlLC3Yetil0

井旺
2023-03-14

你有没有为你这段时间买单的?如果在所有实现中都有“Type”,则可以将interfaceto更改为抽象类并在此处添加变量。

 类似资料:
  • 任何人都可以在下面帮助我吗? 是否可以通过POSTMAN运行SOAP Get Request? 如果是这样,请提供一些链接或步骤,因为我得到错误

  • 我正在使用postman编写一些测试脚本和数据清理脚本,我想知道是否可以对上一步产生的数组结果运行一个请求。 例如,我有一个API,它以JSON的形式返回任务,如下所示: 因此,在测试脚本中,我运行此命令来收集ID数组: 下一个请求是删除一个任务,但是API一次只删除一个。我试着做一些事情,比如: 我希望Postman会看到是一个数组和简单的“工作”,但事实似乎并非如此。有没有可能根据数组输入多次

  • 我遇到了一个奇怪的问题。对于单个HTTP请求,我的servlet的doGet方法被多次调用。每隔10-12秒重新运行一次,直到初始过程完成。 下面是我的servlet代码 下面是web.xml中的映射 我使用的是SEAM和JSF,但这是一个独立的servlet。日志中也没有例外。我还验证了INIT方法只被调用一次。重复的是服务方法。所有重新运行的标识哈希代码都是相同的(System.Identit

  • 主要内容:1 HTTP请求方法1 HTTP请求方法 对于HTTP/1.1协议,定义了一组通用的HTTP请求方法。可以根据要求扩展这些方法。这些方法的名称区分大小写,必须使用大写字母。 请求方法 说明 GET 请求指定的页面信息,并返回实体主体。 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头  POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可

  • 根据HTTP标准,HTTP请求可以使用多种请求方法。 HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。 HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。 序号 方法 描述 1 GET 请求指定的页面信息,并返回实体主体。 2 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 3

  • 本文向大家介绍java发送http get请求的两种方式,包括了java发送http get请求的两种方式的使用技巧和注意事项,需要的朋友参考一下 长话短说,废话不说 一、第一种方式,通过HttpClient方式,代码如下: 二、第二种方式,通过流的形式,贴代码: 这两种实现方式不同,怎么使用看个人喜好吧,不过我在项目开发过程中,使用流的方式部署在预发机(linux机器)上会出现返回null的情况