我有一个由 lombok 创建的 DTO 类的层次结构
@SuperBuilder
。使用它时,其中一个字段会被神秘地重命名。为什么会这样?我该怎么做才能保持原来的名字? 这是 lombok 问题或功能吗 - 但我在 lombok 文档中找不到任何提示?
@SuperBuilder
@Getter
@NoArgsConstructor
public class ExpenseDto {
@NonNull
@Size(max = 30)
protected String recipient;
@NonNull
@Size(max = 30)
protected String purpose;
// ...
protected boolean isInvoiced; // this somehow is changed
}
@Data
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
public class ExpenseEntityDto extends ExpenseDto {
@Size(max = 16)
long expenseId;
@Size(max = 16)
@NonNull
protected String accountNo;
// ...
}
我这样使用它:
public ExpenseEntityDto domainToEntityDto(Expense domain) {
return ExpenseEntityDto.builder()
.expenseId(domain.getExpenseId())
.accountNo(domain.getAccountNo())
.recipient(domain.getRecipient())
.purpose(domain.getPurpose())
.isInvoiced(domain.isInvoiced()) // produces a field 'invoiced' !?
.build();
}
在飞行中,DTO JSON 如下所示:
{
"recipient": "Mobsters Inc.",
"purpose": "protection services rendered",
"expenseId": 1,
"accountNo": "1234",
"invoiced": false // Huh !? expected 'isInvoiced' instead
}
更好的是,openapi 规范(由 quarkus 中的smallrye-openapi 扩展生成)在架构中显示了两个版本(在 swagger ui 中相同):
ExpenseEntityDto:
type: object
properties:
recipient:
maxLength: 30
type: string
purpose:
maxLength: 30
type: string
isInvoiced:
type: boolean
invoiced:
type: boolean
expenseId:
format: int64
type: integer
accountNo:
maxLength: 16
type: string
您当然阅读了文档?
对于以
开头并紧跟首字母大写字母的boolean
字段,没有任何前缀来生成 getter 名称。is
这是默认的 Lombok 行为(不确定是否可以覆盖)。 Lombok 尽可能遵循 Java Beans 规范。名为
isInvoiced
的布尔字段将获得像 isIsInvoiced
这样的访问器,这很令人困惑,因此它不会生成额外的 is
。