代码之家  ›  专栏  ›  技术社区  ›  onouv

lombok@SuperBuilder更改我的一个域名?

  •  0
  • onouv  · 技术社区  · 1 年前

    我有一个由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中的smallyye openapi扩展生成)在Schema中显示了这两个版本(swagg-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
    
    1 回复  |  直到 1 年前
        1
  •  2
  •   M. Deinum    1 年前

    你当然读过了 the documentation ?

    For boolean 以开头的字段 is 紧随其后的是标题大小写字母,没有任何前缀来生成getter名称。

    这是默认的Lombok行为(不确定是否可重写)。龙目岛尽可能地遵循Java Beans规范。一个名为的布尔字段 isInvoiced 会得到一个类似的访问器 isIsInvoiced 这很令人困惑,因此它不会产生额外的 .

    查看JavaBean规范,所有字段都将前缀为 get set 这取决于类型。除了一个例外 布尔值 而不是 得到 将以前缀 .

    为了得到一个 getIsInvoiced 你需要把这块地变成 Boolean 字段而不是a 布尔值 .

    另一种选择是添加Jackson注释,以强制JSON中的字段为 已开具发票 (添加a @JsonProperty("isInvoiced") 去外地应该注意这一点。

    推荐文章