Невозможно заставить логические значения работать на вставке, используя весеннюю загрузку и postgresql - PullRequest
0 голосов
/ 07 октября 2019

У меня возникли некоторые проблемы при работе с булевыми значениями с весенней загрузкой и 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". Я также ожидал бы, что вставим пример того, что было возвращено для выбора, в тело сообщения с новым первичным ключом, который работал над вставкой.

1 Ответ

0 голосов
/ 18 октября 2019

Проблема была связана с тем, как я развертывал военный файл в контейнере. В более ранней версии поле было символом. Я изменил объектный компонент, чтобы сделать его логическим, и скопировал файл war в каталог развертывания экземпляра wildfly. Очевидно, что аннотации JPA в этом случае не обновляются, поэтому изменение в компоненте Entity не было развернуто. Перезапуск экземпляра wildfly устранил проблему без каких-либо изменений кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...