Java 将snake case转换为camel case,用于Spring分页和排序

Java 将snake case转换为camel case,用于Spring分页和排序,java,spring,spring-boot,jackson,Java,Spring,Spring Boot,Jackson,hibernate实体具有以驼峰大小写命名的字段,但是当从RESTAPI返回由该实体构造的DTO时,我们将字段名转换为snake大小写 有一种通用方法可以将每个DTO字段转换为具有类似jackson配置的snake case spring.jackson.property-naming-strategy: SNAKE_CASE 现在的问题是,例如,使用Spring分页和排序,如果我们想按参数排序,我们需要将参数作为camel case而不是snake case传递 例如: 实体如下所示: @D

hibernate实体具有以驼峰大小写命名的字段,但是当从RESTAPI返回由该实体构造的DTO时,我们将字段名转换为snake大小写

有一种通用方法可以将每个DTO字段转换为具有类似jackson配置的snake case

spring.jackson.property-naming-strategy: SNAKE_CASE
现在的问题是,例如,使用Spring分页和排序,如果我们想按参数排序,我们需要将参数作为camel case而不是snake case传递

例如:

实体如下所示:

@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;
}
@Data
public class EntityDTO implements Serializable {

  private UUID id;

  private String someText;
}
DTO如下所示:

@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;
}
@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而不是someu text,这很容易混淆,因为输出是蛇形而不是驼峰形

spring.jackson.property-naming-strategy=SNAKE_CASE
所以一般的问题是如何处理这个问题?有没有聪明的方法?某些jackson配置或参数处理程序配置?或者我需要手动将每个snake-case参数转换为camel-case吗

提前谢谢你们



您可以在application.properties文件中输入以下属性,以将Snake case转换为camel case

spring.jackson.property-naming-strategy=SNAKE_CASE
或者,如果只映射单个类,则可以按如下所示对属性进行注释

@JsonProperty("some_text")
private String someText;
或对实体进行如下注释

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

您可以在application.properties文件中输入以下属性,以将Snake大小写转换为camel大小写

spring.jackson.property-naming-strategy=SNAKE_CASE
或者,如果只映射单个类,则可以按如下所示对属性进行注释

@JsonProperty("some_text")
private String someText;
或对实体进行如下注释

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

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

publicpagegetentities(可分页数据可分页){
PageRequest daoPageable=PageRequest.of(
dtoPageable.getPageNumber(),
dtoPageable.getPageSize(),
convertDtoSortToDaoSort(dtoPageable.getSort())
);
返回entityRepository.findAll(可分页);
}
专用排序转换器dtoSort TODAOSORT(排序dtoSort){
返回Sort.by(dtoSort.get())
.map(sortOrder->sortOrder.withProperty(CaseFormat.LOWER\u下划线.to(CaseFormat.LOWER\u CAMEL,sortOrder.getProperty()))
.collect(收集器.toList())
);
}

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

publicpagegetentities(可分页数据可分页){
PageRequest daoPageable=PageRequest.of(
dtoPageable.getPageNumber(),
dtoPageable.getPageSize(),
convertDtoSortToDaoSort(dtoPageable.getSort())
);
返回entityRepository.findAll(可分页);
}
专用排序转换器dtoSort TODAOSORT(排序dtoSort){
返回Sort.by(dtoSort.get())
.map(sortOrder->sortOrder.withProperty(CaseFormat.LOWER\u下划线.to(CaseFormat.LOWER\u CAMEL,sortOrder.getProperty()))
.collect(收集器.toList())
);
}