У меня возникли некоторые проблемы при работе с булевыми значениями с весенней загрузкой и postgresql. У меня удалено поле, которое определено как логическое значение как в компоненте управления данными, так и в таблице базы данных. Похоже, на выборке бросить API остальных мне возвращается символ JSON вместо логического. При вставке, пытаюсь ли я использовать логическое значение или символ (т. Е. Строим тело из ответа на запрос), я получаю сообщение об ошибке. Я работаю на OpenJDK 11.PostgreSQL JDBC Driver 42.2.5. Wildflt 15.
Я пробовал использовать как char "t", как возвращено в select (get), так и JSON boolean true. Определение json boolean, на которое я опирался
https://json -schema.org / creation-json-schema / reference / boolean.html
Вот таблица create
CREATE TABLE TRANSFER_PARTITIONED_IMAGE (
TRANSFER_PARTITIONED_IMAGE_ID INTEGER NOT NULL,
IMAGE_NAME VARCHAR(50) NOT NULL,
REQUESTED_PART_SIZE_MB INTEGER NOT NULL,
SIZE_BYTES INTEGER NOT NULL,
IMAGE_MD5_HASH VARCHAR(100),
NUMBER_PARTITIONS INTEGER,
DELETED BOOLEAN NOT NULL
);
Вот вставка, которую я использовал для помещения строки в таблицу из командной строки postgresql
crowbar=> insert into transfer_partitioned_image
values(45,'foofoobarbarbarbarsnafu',10,10,'aa',10,true);
JSON, возвращаемый для выбора. Обратите внимание, что для логического поля возвращается символ "t".
{
"transferPartitionedImageId": 45,
"imageName": "foofoobarbarbarbarsnafu",
"requestedPartSizeMB": 10,
"sizeBytes": 10,
"imageMD5Hash": "aa",
"numberPartitions": 10,
"deleted": "t"
}
Если я пытаюсь вставить, используя "t" для логического значения, я получаю ошибку сервера 500
{
"timestamp": "2019-10-07T13:48:38.077+0000",
"message": "could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement",
"details": "uri=/crowbar/data/rit/transferPartitionedImage"
}
из файла журнала
2019-10-07 13:48:38,075 INFO [stdout] (default task-1) insert
2019-10-07 13:48:38,075 INFO [stdout] (default task-1) into
2019-10-07 13:48:38,075 INFO [stdout] (default task-1) transfer_partitioned_image
2019-10-07 13:48:38,075 INFO [stdout] (default task-1) (deleted, image_md5_hash, image_name, number_partitions, requested_part_size_mb, size_bytes)
2019-10-07 13:48:38,075 INFO [stdout] (default task-1) values
2019-10-07 13:48:38,075 INFO [stdout] (default task-1) (?, ?, ?, ?, ?, ?)
2019-10-07 13:48:38,076 DEBUG [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-1) could not execute statement [n/a]: org.postgresql.util.PSQLException: ERROR: column "deleted" is of type boolean but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
Если я попытаюсь сделать то же самое, используя логическое значение JSON (пробовал как верхний, так и нижний регистр TRUE)
{
"transferPartitionedImageId": 1111,
"imageName": "foofoobarfoofoobarsnafusnafu",
"requestedPartSizeMB": 10,
"sizeBytes": 10,
"imageMD5Hash": "aa",
"numberPartitions": 10,
"deleted": true
}
Я получу 400 неверных запросовошибка
Status Code: 400 Bad Request
Connection: keep-alive
Date: Mon, 07 Oct 2019 13:53:13 GMT
Transfer-Encoding: chunked
Из журнала
019-10-07 13:53:13,160 DEBUG [org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver] (default task-1) Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `java.lang.Character` out of VALUE_TRUE token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.Character` out of VALUE_TRUE token
at [Source: (PushbackInputStream); line: 8, column: 14] (through reference chain: com.ticomgeo.crowbar.data.entity.TransferPartitionedImage["deleted"])]
Мое определение бина сущности показано ниже
Entity Bean definition
@Entity
public class TransferPartitionedImage implements Serializable {
private static final long serialVersionUID = -3444719649254510891L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer transferPartitionedImageId;
@NotNull
@Size(min = 10, max = 50, message = "Image name must be 10 to 50 characters")
@Column(name = "IMAGE_NAME", nullable = false, length = 50)
private String imageName;
@NotNull
@Column(name = "REQUESTED_PART_SIZE_MB", nullable = false)
private Integer requestedPartSizeMB;
@Column(name = "SIZE_BYTES")
private Integer sizeBytes;
@Column(name = "IMAGE_MD5_HASH")
private String imageMD5Hash;
@Column(name = "NUMBER_PARTITIONS")
private Integer numberPartitions;
@Column (name = "DELETED")
private Boolean deleted;
public Integer getTransferPartitionedImageId() {
return transferPartitionedImageId;
}
public void setTransferPartitionedImageId(Integer transferPartitionedImageId) {
this.transferPartitionedImageId = transferPartitionedImageId;
}
public String getImageName() {
return imageName;
}
public void setImageName(String imageName) {
this.imageName = imageName;
}
public Integer getRequestedPartSizeMB() {
return requestedPartSizeMB;
}
public void setRequestedPartSizeMB(Integer requestedPartSizeMB) {
this.requestedPartSizeMB = requestedPartSizeMB;
}
public Integer getSizeBytes() {
return sizeBytes;
}
public void setSizeBytes(Integer sizeBytes) {
this.sizeBytes = sizeBytes;
}
public String getImageMD5Hash() {
return imageMD5Hash;
}
public void setImageMD5Hash(String imageMD5Hash) {
this.imageMD5Hash = imageMD5Hash;
}
public Integer getNumberPartitions() {
return numberPartitions;
}
public void setNumberPartitions(Integer numberPartitions) {
this.numberPartitions = numberPartitions;
}
public Boolean getDeleted() {
return deleted;
}
public void setDeleted(Boolean deleted) {
this.deleted = deleted;
}
public Boolean isDeleted() {
return deleted ;
}
Я ожидал, что выборка вернула JSON Boolenт.е. удалено: true
вместо символа "t". Я также ожидал бы, что вставим пример того, что было возвращено для выбора, в тело сообщения с новым первичным ключом, который работал над вставкой.