将蛇案转换为骆驼案以进行春季分页和排序

时间:2020-01-10 17:46:32

标签: java spring spring-boot jackson

休眠实体具有以驼峰大小写命名的字段,但是当从该实体构造的DTO从REST API返回时,我们会将字段名称转换为蛇形大小写。

有一种通用方法可以将每个DTO字段转换成具有像这样的杰克逊配置的蛇形盒

spring.jackson.property-naming-strategy: SNAKE_CASE

这是一个问题,例如,在Spring分页和排序中,如果要按参数排序,则需要以驼峰大小写而不是蛇形大小写形式传递参数。

示例:

实体看起来像这样:

@Data
@Entity
@Table
public class Entity {

  @Id
  @Column(name = "id", updatable = false, nullable = false)
  @GeneratedValue(generator = "uuid")
  @Access(AccessType.PROPERTY)
  private UUID id;

  @Column(name = "some_text")
  private String someText;
}

DTO看起来像这样:

@Data
public class EntityDTO implements Serializable {

  private UUID id;

  private String someText;
}

输出JSON如下:

{
  "id": "80fb034a-36c1-4534-a39f-b344fa815a2d",
  "some_text": "random text"
}

现在,如果我们想使用排序参数来调用端点,例如:

/entities?sort=some_text&some_text.dir=desc

这是行不通的,因为实体中的字段实际上是someText而不是some_text,这非常令人困惑,因为输出是在蛇形情况下而不是骆驼式情况。

所以一般的问题是如何处理?有什么聪明的方法吗?一些杰克逊配置或参数处理程序配置?还是我需要手动将每个蛇形例参数手动转换为骆驼形例?

谢谢你们。


2 个答案:

答案 0 :(得分:1)

您将application.properties文件中的以下属性转换为Snake大小写为驼峰大小写。

spring.jackson.property-naming-strategy=SNAKE_CASE

或者,如果仅映射单个类,则可以按如下所示注释属性。

@JsonProperty("some_text")
private String someText;

或如下注释实体

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

答案 1 :(得分:0)

下面,我提供解决方案,无需定义将每个DTO字段名称映射到其对应的DAO /实体字段名称的解决方案。它使用Google Guava库中的com.google.common.base.CaseFormat类的常量和方法将字符串从一种情况转换为另一种情况。我假设您是从org.springframework.data.domain.Pageable类实例的请求中提取分页和订购信息。

public Page<Entity> getEntities(Pageable dtoPageable) {
    PageRequest daoPageable = PageRequest.of(
                                  dtoPageable.getPageNumber(),
                                  dtoPageable.getPageSize(),
                                  convertDtoSortToDaoSort(dtoPageable.getSort())
    );
    return entityRepository.findAll(daoPageable);
}

private Sort convertDtoSortToDaoSort(Sort dtoSort) {
    return Sort.by(dtoSort.get()
                          .map(sortOrder -> sortOrder.withProperty(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, sortOrder.getProperty())))
                          .collect(Collectors.toList())
    );
}