![](/img/trans.png)
[英]How to auto convert camel case request body to snake case protobuf message in Spring Boot
[英]Convert snake case to camel case for Spring Paging and Sorting
休眠实体具有以驼峰命名的字段,但是当从该实体构造的 DTO 从 REST API 返回时,我们将字段名称转换为蛇形。
有一种通用的方法可以将每个 DTO 字段转换为带有 jackson 配置的蛇形案例,如下所示
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 这很令人困惑,因为输出是蛇形而不是驼色。
所以普遍的问题是如何处理这个问题? 有没有聪明的方法来做到这一点? 一些杰克逊配置或参数处理程序配置? 或者我是否需要手动将每个蛇形案例参数转换为驼色案例?
提前谢谢你们。
您可以在 application.properties 文件中使用以下属性将 Snake 案例转换为驼峰案例。
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
类的实例中从请求中提取分页和订购信息。
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())
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.