首页 > 解决方案 > 如何创建具有多个“级别”的 Spring Boot API

问题描述

我的问题很简单,但我真的不知道如何解决它。

对不起,我什至不知道这些“级别”实际上是如何被调用的。孩子们?标签?此外,我在整个 API REST 和 Spring Boot 和 JPA 方面还是相当新的,比如我目前正在实习,几乎可以独自完成一些任务。但不管怎么说。

我希望我的 API 作为响应返回的是:

<base>  
    <level1>
       <info1>
          <something1>{database data}</something1>
          <something2>{database data}</something2>
       </info1>
    </level1>
    <level2>
       <info2>
          <something3>{database data}</something3>
       </info2>
    </level2>
</base>

但现在它通过 GET 请求返回的只是这个 XML:

<something1>{database data}</something1>
<something2>{database data}</something2>
<something3>{database data}</something3>

数据库数据来自我使用 JPA 获得的数据库中的单个表,而 something1、something2、something3 实际上是表列。

我正在使用 Spring Boot、JPA、Maven、Liquibase ......
有什么方法可以实现我想要的吗?获取level1,info1 ...如果是这样,如何?

这就是我获取 XML 的方式:

@Repository
public interface AggregationDocumentRepository
    extends JpaRepository<AggregationDocumentEntity, Long> {
}
  public List<AggregationDocumentEntity> getAllAggregationDocuments() {
    return aggregationDocumentRepository.findAll();
  }
  @GetMapping(value = "/aggregation", produces = {"application/json", "application/xml"})
  public List<AggregationDocumentEntity> getAllAggregationDocuments() {
    List<AggregationDocumentEntity> allAggregationDocuments =
        aggregationDocumentService.getAllAggregationDocuments();
    if (allAggregationDocuments.size() == 0) {
      log.error(
          "Cannot return the agreggation documents: there is no aggregation documents in the database.");
    } else {
      log.info("Returned all aggregation documents in the database.");
    }
    return allAggregationDocuments;
  }

我也有实体,它具有 16 个值的 getter 和 setter,它们是数据库的 16 列。
一切都很好。API 响应只需要具有这些“级别”。

先感谢您。

标签: javaspringspring-bootapirest

解决方案


因此,如果我理解正确,您只想更改 xml 表示模型,我使用 Jackson 依赖项来解决该问题:

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>     
    </dependency>   

这是一个示例代码:

@JacksonXmlRootElement(localName = "students")
@Data
public class StudentsRepresentationModel {
    
    @JsonProperty("student")
    @JacksonXmlElementWrapper(useWrapping = false) // Usado para
    @NonNull
    private List<StudentModel> students;

}

带有 useWrapping = false 的 XML:

<students>
    <student>
        <id>1</id>
        <name>John</name>
    </student>
    <student>
        <id>2</id>
        <name>Steven</name>
    </student>
<students>

带有 useWrapping = true 的 XML:

<students>
    <student>
        <student>
        <id>2</id>
        <name>Steven</name>
        </student>
    <student>
    <student>
        <student>
        <id>2</id>
        <name>Steven</name>
        </student>
    <student>
<students>

如果您在文档中看到,您可以让您的 Wrapper 显示或不显示级别并更改它们的名称,在您的情况下,您将 JpaRepository 的方法实现获取到 XML 并列出它们但是如果您禁用它并使用创建另一个 Wrapper同样的服务,您可以完成这项工作!


推荐阅读