【问题标题】:Fasterxml Jackson databind MismatchedInputExceptionFasterxml Jackson 数据绑定 MismatchedInputException
【发布时间】:2020-04-17 13:39:15
【问题描述】:

我在 Spring Boot 应用程序中使用 com.fasterxml.jackson.databind。当我向端点发送请求时,我收到以下异常:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of 
org.pacakge.domain.controller.Mycontroller (although at least one Creator exists): cannot
deserialize from Object value (no delegate- or property-based Creator)\n at 
[Source: (PushbackInputStream); line: 2, column: 3]  Is the body of the request formatted correctly?

我的控制器处理具有以下结构的请求正文:

{
  "portalId": 123,
  "objectType": "TYPE",
  "objectTypeId": "0-3",
  "objectId": 123,
  "properties": { ... }
}

我需要的唯一属性是objectId。我已经构建了一个类来处理这个对象,如下所示:

@lombok.Value
private static class MyObject {
  @JsonAlias("objectId")
  private final String dealId;
} 

我设计了一个看起来像这样的控制器

@Slf4j
@RestController
@RequestMapping(path = "/entrypoint")
public class MyController {
   @Autowired
   public MyController(){}
   /**
   * REST endpoint handles MyObject
   */
  @PostMapping(value = "/endpoint")
  public void handleRequest(
      @Valid @RequestBody MyObject command
      ) {
          log.debug(command.getDealId());
   }
   @lombok.Value
   private static class MyObject {
     @JsonAlias("objectId")
     private final String dealId;
   } 
}

这个问题的有趣之处在于,如果我将MyObject 更改为以下结构,我的请求会得到很好的处理:

@lombok.Value
  private static class MyObject {
    @JsonAlias("objectId")
    private final String dealId;
    private final JSONObject properties;  // TODO we shouldn't need this.  Fix.
  }

我似乎无法弄清楚问题所在。我很想在这个问题上得到一些帮助。也许有我缺少的注释?我希望其他人遇到过这个问题。我只是通过搜索网络没有找到任何关于它的信息。

【问题讨论】:

    标签: java spring-boot jackson jackson-databind


    【解决方案1】:

    我在项目根目录的lombok.config中添加了下面这行:

    lombok.anyConstructor.addConstructorProperties=true
    

    之后,使用 @JsonIgnoreProperties 注释设法使用此 DTO 反序列化您的 JSON:

    @Value
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class MyObject {
        @JsonProperty("objectId")
        String dealId;
    }
    

    【讨论】:

    • 嗨,亚历克斯,您的回答有效。另外,我也想出了另一种解决方法。如果我添加默认构造函数并将dealId 设置为null,似乎问题已解决。然后添加另一个以dealId为参数的构造函数,并将this.dealId添加到参数中。谢谢!
    • 还有一种方法可以减少 POJO 的代码,看看吧! :)
    猜你喜欢
    • 2016-08-07
    • 2019-06-24
    • 2021-01-25
    • 2019-09-17
    • 2021-11-10
    • 2017-11-26
    • 2020-11-24
    • 2015-08-02
    • 1970-01-01
    相关资源
    最近更新 更多