SpringBoot:持久化嵌套JSON [使用spring-boot-starter-data-rest + sql]

huangapple 未分类评论44阅读模式
英文:

SpringBoot: Persist nested JSON [using spring-boot-starter-data-rest + sql]

问题

以下是您提供的内容的翻译部分:

我有以下的POST请求:

  1. {
  2. "name": "Peter",
  3. "lastName": "Smith",
  4. "contact": {
  5. "phone": "12345679",
  6. "email": "peter@smith.com"
  7. }
  8. }

我想要将其存储在SQL数据库中,如下所示:

| id (int) | name (varchar) | lastName (varchar) | contact (JSON) |

我正在使用spring-boot-starter-data-rest,因此我只有UserRepositoryUser实体,其中有一个嵌入式属性contact

User.java

  1. @Entity
  2. @Table(name="user")
  3. public class User {
  4. @Id
  5. @GeneratedValue(strategy = GenerationType.IDENTITY)
  6. private Long id;
  7. @Column(name = "name")
  8. private String title;
  9. @Column(name = "lastName")
  10. private String lastName;
  11. @Embedded
  12. @Column(name = "contact")
  13. private Contact contact;
  14. }

Contact.java

  1. @Embeddable
  2. public class Contact {
  3. private String phone;
  4. private String email;
  5. }

UserRepository.java

  1. public interface UserRepository extends JpaRepository<User, Integer> {
  2. //
  3. }

如果我进行POST请求,会出现错误,因为(猜测)我没有将Contact转换为JSON。

我已经尝试添加了@Convert(converter = HashMapConverter.class),但是出现了错误。

HashMapConverter

  1. public class HashMapConverter implements AttributeConverter<Object, String> {
  2. private static final ObjectMapper om = new ObjectMapper();
  3. @Override
  4. public String convertToDatabaseColumn(Object attribute) {
  5. try {
  6. return om.writeValueAsString(attribute);
  7. } catch (JsonProcessingException ex) {
  8. //log.error("Error while transforming Object to a text datatable column as json string", ex);
  9. return null;
  10. }
  11. }
  12. @Override
  13. public Object convertToEntityAttribute(String dbData) {
  14. try {
  15. return om.readValue(dbData, Object.class);
  16. } catch (IOException ex) {
  17. //log.error("IO exception while transforming json text column in Object property", ex);
  18. return null;
  19. }
  20. }
  21. }
英文:

I have the following POST request:

  1. {
  2. &quot;name&quot;: &quot;Peter&quot;,
  3. &quot;lastName&quot;: &quot;Smith&quot;,
  4. &quot;contact&quot;: {
  5. &quot;phone&quot;:&quot;12345679&quot;,
  6. &quot;email&quot;: &quot;peter@smith.com&quot;
  7. }
  8. }

And I would like to store that in a SQL DB as follow:

| id (int) | name (varchar) | lastName (varchar) | contact (JSON) |

I'm using spring-boot-starter-data-rest so I only have the UserRepository and User Entity, which has an Embedded property contact

User.java

  1. @Entity
  2. @Table(name=&quot;user&quot;)
  3. public class User {
  4. @Id
  5. @GeneratedValue(strategy = GenerationType.IDENTITY)
  6. private Long id;
  7. @Column(name = &quot;name&quot;)
  8. private String title;
  9. @Column(name = &quot;lastName&quot;)
  10. private String lastName;
  11. @Embedded
  12. @Column(name = &quot;contact&quot;)
  13. private Contact contact;
  14. }

Contact.java

  1. @Embeddable
  2. public class Contact {
  3. private String phone;
  4. private String email;
  5. }

UserRepository.java

  1. public interface UserRepository extends JpaRepository&lt;User, Integer&gt; {
  2. //
  3. }

If I make a POST request I get an error, because (guess) I'm not converting Contact to JSON.

I've already tried adding a @Convert(converter = HashMapConverter.class) but I get an error.

HashMapConverter

  1. public class HashMapConverter implements AttributeConverter&lt;Object, String&gt; {
  2. private static final ObjectMapper om = new ObjectMapper();
  3. @Override
  4. public String convertToDatabaseColumn(Object attribute) {
  5. try {
  6. return om.writeValueAsString(attribute);
  7. } catch (JsonProcessingException ex) {
  8. //log.error(&quot;Error while transforming Object to a text datatable column as json string&quot;, ex);
  9. return null;
  10. }
  11. }
  12. @Override
  13. public Object convertToEntityAttribute(String dbData) {
  14. try {
  15. return om.readValue(dbData, Object.class);
  16. } catch (IOException ex) {
  17. //log.error(&quot;IO exception while transforming json text column in Object property&quot;, ex);
  18. return null;
  19. }
  20. }
  21. }

答案1

得分: 0

你需要为Contact创建一个实体,然后在两者之间创建一对一的关系。查看这个示例

英文:

You need to create an entity for Contact and then create a one to one relationship between the two. Check out this example.

答案2

得分: 0

  1. 我已经有一个用于存储 JSON 字段的相同情况,它完美地工作。请尝试:
  2. pom.xml 中添加依赖:
  3. <dependency>
  4. <groupId>com.vladmihalcea</groupId>
  5. <artifactId>hibernate-types-52</artifactId>
  6. <version>2.9.7</version>
  7. </dependency>
  8. User 类中进行编辑:
  9. @Entity
  10. @TypeDef(name = "json", typeClass = JsonStringType.class)
  11. public class User {
  12. // 其他字段在这里
  13. @Type(type = "json")
  14. @Column(columnDefinition = "json")
  15. private Contact contact;
  16. // getter 和 setter 方法
  17. }
  18. 当然,您的数据库应支持 json 类型。例如,对于 MariaDB,您可以参考 https://mariadb.com/kb/en/json-data-type/
英文:

i've got the same case for storing json field which is working perfectly. Please try :

Add dependency to pom.xml :

  1. &lt;dependency&gt;
  2. &lt;groupId&gt;com.vladmihalcea&lt;/groupId&gt;
  3. &lt;artifactId&gt;hibernate-types-52&lt;/artifactId&gt;
  4. &lt;version&gt;2.9.7&lt;/version&gt;
  5. &lt;/dependency&gt;

Edit User class within :

  1. @Entity
  2. @TypeDef(name = &quot;json&quot;, typeClass = JsonStringType.class)
  3. public class User {
  4. // other field here
  5. @Type(type = &quot;json&quot;)
  6. @Column(columnDefinition = &quot;json&quot;)
  7. private Contact contact;
  8. // getters, setters
  9. }

Of course your database should support json type. For MariaDB for example you can refer to https://mariadb.com/kb/en/json-data-type/

huangapple
  • 本文由 发表于 2020年4月5日 03:22:51
  • 转载请务必保留本文链接:https://java.coder-hub.com/61033575.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定