【问题标题】:JSON Mapping Exception while calling post method with request body使用请求正文调用 post 方法时出现 JSON 映射异常
【发布时间】:2017-06-24 09:48:39
【问题描述】:

我有一个具有以下提到合同的控制器 ---

  @RequestMapping(value="/api/devices/certs",method = RequestMethod.POST,consumes={"application/json","application/xml"})
    public String submitCertificate(@RequestBody Certificate certificate){
        System.out.println(certificate.getBase64String());
        return certificate.getBase64String();
    }

除此之外还有两个 pojo 类 --

1)

public class DeviceCertificateRequest implements Serializable {

    private static final long serialVersionUID = -4408117936126030294L;
    private Certificate certificate;

    public Certificate getCertificate() {
        return certificate;
    }

    public void setCertificate(Certificate certificate) {
        this.certificate = certificate;
    }

    @Override
    public String toString() {
        return "DeviceCertifficateRequest [certificate=" + certificate + "]";
    }

}

2)

public class Certificate implements Serializable {

    private static final long serialVersionUID = 4044105355620137636L;
    private String base64String;

    public String getBase64String() {
        return base64String;
    }

    public void setBase64String(String base64String) {
        this.base64String = base64String;
    }

    @Override
    public String toString() {
        return "Certificate [base64String=" + base64String + "]";
    }

}

现在我正在使用 spring boot 并为内容协商添加了 jackson-data-bind 依赖项,我还想同时使用 json 和 xml 数据作为输入,从而将其映射到 POJO 文件。

但我无法达到预期的结果,即使我在尝试从休息客户端发送 json 时在日志中遇到以下提到的错误。

错误----

ERROR] 2017-02-07 13:48:45.448 [http-nio-8080-exec-1] ConfigManagerExceptionHandler - exception while accessing url:-http://localhost:8080/api/devices/certserror message:-Could not read document: Can not construct instance of com.lufthansa.configmanager.request.beans.Certificate: no String-argument constructor/factory method to deserialize from String value ('DeviceCertificateRequest')
 at [Source: java.io.PushbackInputStream@3c891128; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.lufthansa.configmanager.request.beans.Certificate: no String-argument constructor/factory method to deserialize from String value ('DeviceCertificateRequest')
 at [Source: java.io.PushbackInputStream@3c891128; line: 1, column: 1]

Json 发送过去--

    "certificate": {
    "base64String": "abc"
  }

请让我知道它是否也适用于 xml 有效负载,因为我想同时使用 xml 和 json 输入

【问题讨论】:

标签: json xml rest spring-boot


【解决方案1】:

我通过在 POJO 类中创建参数化构造函数来工作,似乎杰克逊数据绑定需要一个参数化构造函数来创建对象。

仍然需要检查 xml 输入。

【讨论】:

    【解决方案2】:
    1. 向我们展示您如何提出请求并仔细检查变量名称。
    2. 检查并重新检查控制器中的 IMPORTS 是否正确,证书是否实际上来自您的包而不是其他包。
    3. 添加 @JsonInclude(Include.NON_NULL) 类Foo{} 所以你不会有空问题。
    4. 从证书中删除以测试 serialVersionUID。
    5. 尝试将@ResponseBody 添加到您的消费控制器方法中。
    6. 尝试发送

      { “base64String”:“abc” }

    没有变量名。

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 2011-01-06
      相关资源
      最近更新 更多