SpringBoot: Persist nested JSON [с использованием spring-boot-starter-data-rest + sql] - PullRequest
1 голос
/ 04 апреля 2020

У меня есть следующий запрос POST:

{
    "name": "Peter",
    "lastName": "Smith", 
    "contact": {
        "phone":"12345679",
        "email": "peter@smith.com"
    }
}

И я хотел бы сохранить его в SQL DB следующим образом:

| id (int) | имя (варчар) | lastName (varchar) | contact (JSON) |

Я использую spring-boot-starter-data-rest, поэтому у меня есть только сущность UserRepository и User, которая имеет Embedded свойство контакт

пользователь. java

@Entity
@Table(name="user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

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

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

    @Embedded
    @Column(name = "contact")
    private Contact contact;


 }

контакт. java

@Embeddable
public class Contact {
   private String phone;
   private String email;
}

UserRepository. java

public interface UserRepository extends JpaRepository<User, Integer> {
    //     
}

Если я сделаю POST-запрос, я получу ошибку, потому что (думаю) я не преобразую Contact в JSON.

Я уже пытался добавить @Convert(converter = HashMapConverter.class), но я получаю сообщение об ошибке.

HashMapConverter

public class HashMapConverter implements AttributeConverter<Object, String> {

    private static final ObjectMapper om = new ObjectMapper();

    @Override
    public String convertToDatabaseColumn(Object attribute) {
        try {
            return om.writeValueAsString(attribute);
        } catch (JsonProcessingException ex) {
            //log.error("Error while transforming Object to a text datatable column as json string", ex);
            return null;
        }
    }

    @Override
    public Object convertToEntityAttribute(String dbData) {
        try {
            return om.readValue(dbData, Object.class);
        } catch (IOException ex) {
            //log.error("IO exception while transforming json text column in Object property", ex);
            return null;
        }
    }

}

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

У меня такой же случай для хранения поля json, которое работает отлично. Пожалуйста, попробуйте:

Добавить зависимость к pom. xml:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>2.9.7</version>
</dependency>

Изменить класс пользователя в:

@Entity
@TypeDef(name = "json", typeClass = JsonStringType.class)
public class User {
    // other field here
    @Type(type = "json")
    @Column(columnDefinition = "json")
    private Contact contact;
    // getters, setters
}

Конечно, ваша база данных должна поддерживать json тип. Для MariaDB, например, вы можете обратиться к https://mariadb.com/kb/en/json-data-type/

0 голосов
/ 04 апреля 2020

Вам необходимо создать сущность для Contact, а затем создать отношения один к одному между двумя. Проверьте это пример .

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