【问题标题】:How to GET data in the JSON format form the DB Repository如何从数据库存储库中获取 JSON 格式的数据
【发布时间】:2020-05-20 13:31:51
【问题描述】:

我有这个 JPA 类,其中有 3 列 idnamedate。数据库已经填充了数据,其中每个条目都有一个 id。

@Data
@Entity
@Table(name = "TEST", schema = "TESTSCHEMA")
public class TestDataJpaRecord implements Serializable {
    private static final long serialVersionUID = 1L;

    TestDataJpaRecord(){
        // default constructor
    }

    public TestDataJpaRecord(
       String name,
       Date date,
    ){
        this.name = name;
        this.date = date;
    }

    @Id
    @Column(name = "ID", nullable = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
            generator = "TEST_SEQUENCE")
    @SequenceGenerator(
            sequenceName = "TEST_SEQUENCE", allocationSize = 1,
            name = "TEST_SEQUENCEx")
    private Long id;

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

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "DATE")
    private Date date;
}

我为所有数据创建了一个 JPA 存储库。

public interface TestDataJpaRecordRepository extends JpaRepository<TestDataJpaRecord, Long> {
}

我想从数据库中获取 JSON 格式的数据。 这是我的 Rest GET Api。这里我只是将数据作为字符串返回,但我想将它们作为 JSON 返回。

@GetMapping(value = "data/{id}")
    private ResponseEntity<?> getDataFromTheDB(@PathVariable("id") Long id) {

        // get one entry form the DB
        TestDataJpaRecord testDataJpaRecord =testDataJpaRecordRepository.findOne(id); 

        // Here I want to return a JSON instead of a String 
        return new ResponseEntity<>(testDataJpaRecord.toString(), HttpStatus.OK);
    }

关于如何将数据返回为 JSON 而不是数据库中的字符串的任何想法? 我将非常感谢任何建议。

【问题讨论】:

  • 不要调用 toString new ResponseEntity&lt;&gt;(testDataJpaRecord, HttpStatus.OK);
  • @AlanHay 不幸的是我收到了这个错误:`“异常”:“org.springframework.http.converter.HttpMessageNotWritableException”,“消息”:“无法编写 JSON:直接自引用导致循环; 嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException: Direct self-referenceleading to cycle`

标签: json spring-boot jpa get spring-data-jpa


【解决方案1】:

如果你在类路径上有 Jackson,如果你使用了 spring-boot-starter-web,那么你应该这样做:

@GetMapping(value = "data/{id}")
private ResponseEntity<TestDataJpaRecord> getDataFromTheDB(@PathVariable("id") Long id) {
    TestDataJpaRecord testDataJpaRecord =testDataJpaRecordRepository.findOne(id); 
    return new ResponseEntity.ok(testDataJpaRecord);
}

这假设您使用@RestController 而不是@Controller 注释了您的控制器。如果没有,那么您可以这样做,或者使用 @ResponseBody 注释您的控制器方法。

启用 Spring Data 的 Web 支持(Spring Boot 应该默认启用),那么您还可以简化如下:

@GetMapping(value = "data/{id}")
private ResponseEntity<TestDataJpaRecord> 
         getDataFromTheDB(@PathVariable("id") TestDataJpaRecord record) {
    return new ResponseEntity.ok(record);
}

见:

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#core.web.basic.domain-class-converter

【讨论】:

  • 我已经注释了控制器@RestController,但不幸的是我得到了以下错误:“异常”:“org.springframework.http.converter.HttpMessageNotWritableException”,“消息”:“无法写入JSON:直接自引用导致循环;嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException: 直接自引用导致循环
  • 嗯,这完全是另一个问题,已经回答了很多次了。见这里:baeldung.com/…
  • 我读了这篇文章,它是关于具有双向关系的实体,这不是我的情况。我的班级与其他班级没有任何关系...
  • 您需要发布完整的实体,因为错误表明它引用了同一类型的另一条记录。 google.com/…
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 2016-12-08
相关资源
最近更新 更多