使用 Spring Boot 和 PostgreSQL 发布 JSON Blob

Posting a JSON Blob with Spring Boot and PostgreSQL

我正在使用 Angular 2 将以下 JSON 发送到 Spring 引导控制器:

{
  "portal_name": "test",
  "app_name": "test",
  "app_owner": "test",
  "app_submitter": "test",
  "onboarding_form_blob": [
    {
      "newSplunkRow": "test"
    }
  ]
}

但是当我发送 JSON 时,我从 Spring 控制器收到了这个错误:

Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON document: Can not deserialize instance of java.lang.String out of START_ARRAY token

Blob 的控制器如下所示:

@Column(name = "onboarding_form_blob")
private String onboarding_form_blob;

这些是吸气剂和吸气剂:

public String getOnboarding_form_blob() {
            return onboarding_form_blob;
        }

public void setOnboarding_form_blob(String onboarding_form_blob) {
            this.onboarding_form_blob = onboarding_form_blob;
        }

你的 JSON 有效载荷对我来说很清楚:

不完全确定您的控制器是什么样子。如果您提供控制器中方法的完整签名和完整的 Blob class,将会很有帮助。但我现在猜它看起来像这样?

如果是这样:那么@Veeram 是对的。 问题是 newSplunkRow 的 getter 和 setter 需要一个字符串,而您发送的是一个包含一个对象而不是该字符串的数组。

您可以通过更换控制器或更改您要发送的 JSON 来匹配控制器来修复它。什么是最好的取决于您要发送的数据以及您希望在收到数据后如何处理。 (根据你的 @Column 注释,我猜你打算将它存储在数据库中?你的表是什么样的?)

在您的请求正文中,onboarding_form_blob 字段是一个数组,但在您的 POJO 中(假设在您的控制器中是预期的请求正文类型)onboarding_form_blob 不是集合类型。所以你有两个选择:

1.change onboarding_form_blob 输入 POJO 到 List,像这样:

@Column(name = "onboarding_form_blob")
private List<String> onboarding_form_blob;

public List<String> getOnboarding_form_blob() {
            return onboarding_form_blob;
}

public void setOnboarding_form_blob(List<String> onboarding_form_blob) {
            this.onboarding_form_blob = onboarding_form_blob;
}

并将您的 JSON 有效负载更改为字符串数组:

"onboarding_form_blob": [
"{\"newSplunkRow\": \"test\"}",
"{\"newSplunkRow2\": \"test2\"}"
]

2。保留当前的 ​​POJO,但修改 JSON 有效负载,使其看起来像一个字符串,如下所示:

{
  "portal_name": "test",
  "app_name": "test",
  "app_owner": "test",
  "app_submitter": "test",
  "onboarding_form_blob": "[{\"newSplunkRow\": \"test\"}]"
}

注意 JSON 有效负载的 onboarding_form_blob 字段中的转义双引号

我确定您知道 JSON 是一个文本协议,而 BLOB 是一个二进制对象,为了以 JSON 表示法存储任何二进制对象,您必须转换 BLOB到 base64 编码的字符串,这将处理任何可能破坏 JSON 协议的字符。

这样您就可以将 onboarding_form_blob 声明为字符串(顺便说一下,这个名称有点误导,因为 blob 在数据库术语中表示二进制大对象):

@Column(name = "onboarding_form_blob")
private String onboarding_form_blob;

像这样你发送JSON个对象:

 "onboarding_form_blob": [
    {
      "newSplunkRow": "test"
    }
  ]

事实上解析器认为这个结构应该是一个数组。

这显然是对json格式的误解。如果你声明一个字符串,发送一个字符串:

 "onboarding_form_blob": "[\r\n    {\r\n      \"newSplunkRow\": \"test\"\r\n    }\r\n  ]"