当前位置: 首页 > 知识库问答 >
问题:

将蛇盒转换为骆驼盒,用于Spring分页和排序

谢和颂
2023-03-14

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;
}

DTO看起来像这样:

@Data
public class EntityDTO implements Serializable {

  private UUID id;

  private String someText;
}

输出JSON如下所示:

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

现在,如果我们想调用具有排序参数的endpoint,例如:

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

它将不起作用,因为实体中的字段实际上是someText而不是someu text,这很容易混淆,因为输出是蛇形而不是驼峰形。

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

提前谢谢你们。

共有2个答案

赵佐
2023-03-14

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

java prettyprint-override">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())
    );
}
凌照
2023-03-14

您可以在应用程序中输入以下属性。属性文件,用于将蛇壳转换为驼峰壳。

spring.jackson.property-naming-strategy=SNAKE_CASE

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

@JsonProperty("some_text")
private String someText;

或对实体进行如下注释

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
 类似资料:
  • 我有一个简单的路线,看起来像这样: CXF 配置也非常简单: 此简单路由失败,出现以下异常 这是消息历史记录,表明它在

  • 问题内容: 我看到可以将Docker映像转换为Vagrant框。 有没有一种方法可以将Vagrant框转换为Docker映像? 问题答案: 我在Github项目blacklabelops / centos中 使用EC2框和Virtualbox框重播了此内容。我已经准备了具有必要安装的Vagrantfile,您可以在Vagrant盒中尝试一下。 EC2盒: 使用https://github.com/

  • 谁能告诉我如何将字符串转换snake_case: 到camelCase中的字符串为: 在Java? 提前谢谢你。

  • 黑盒测试,白盒测试与灰盒测试的比较和区别如下所示: 编号 黑盒测试 白盒测试 灰盒测试 1 不需要了解内部工作结构(代码)。测试用例只需要GUI(图形用户界面)。 测试需要了解内部工作结构(软件编码)。 部分了解内部工作结构。 2 黑盒测试也称为功能测试,数据驱动测试和封闭盒测试。 白盒测试也称为结构测试,透明盒测试,基于代码的测试和透明测试。 灰盒测试也称为半透明测试,因为测试人员对编码知识有限

  • 我试图用y轴和x轴对边界框进行排序,但我从tl()中找到的结果除外。x和tl()。y有点混乱,经过大量工作,我在文档中找不到任何东西。下面是一些结果,请看一看。我希望他们从1点到30点有序 代码: 编辑: 原始图片: