J'ai la demande POST suivante:
{
"name": "Peter",
"lastName": "Smith",
"contact": {
"phone":"12345679",
"email": "[email protected]"
}
}
Et je voudrais stocker que dans une base de données SQL comme suit:
| id (int) | nom (varchar) | lastName (varchar) | contact (JSON) |
J'utilise spring-boot-starter-data-rest
donc j'ai seulement UserRepository
et une User
entité, qui a une intégrée propriété de contact
User.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;
}
Contact.java
@Embeddable
public class Contact {
private String phone;
private String email;
}
UserRepository.java
public interface UserRepository extends JpaRepository<User, Integer> {
//
}
Si je fais une demande POST je reçois une erreur, parce que (estimation) Je ne suis pas convertir Contact
en JSON.
Je l' ai déjà essayé d' ajouter un @Convert(converter = HashMapConverter.class)
mais je reçois une erreur.
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;
}
}
}
J'ai le même cas pour le stockage champ JSON qui fonctionne parfaitement. S'il vous plaît essayez :
Ajouter la dépendance à l'pom.xml:
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>2.9.7</version>
</dependency>
Modifier la classe des utilisateurs dans:
@Entity
@TypeDef(name = "json", typeClass = JsonStringType.class)
public class User {
// other field here
@Type(type = "json")
@Column(columnDefinition = "json")
private Contact contact;
// getters, setters
}
Bien sûr , votre base de données devrait soutenir le type JSON. Pour MariaDB par exemple , vous pouvez vous référer à https://mariadb.com/kb/en/json-data-type/