天天看點

基于grpc從零開始搭建一個準生産分布式應用(6) - 06 - MapStruct常見問題彙總

開始前必讀:​​基于grpc從零開始搭建一個準生産分布式應用(0) - quickStart​​ 

1、Unknown property "discount" in result type TestMixBO. Did you mean "null"?可能有以種原因:

  1. 屬性名寫錯了;
  2. maven中的編譯插件中lombok的配置配置在了mapstrut之後,導緻lombok注解沒有執行;

2、Unknown property "discount" in result type TestMixBO. Did you mean "discountG"?

BO類中屬性名和setter/getter方法名稱不比對,這個一般是由人工修改引起的;

3、No property name "discount" exsits in source parameter(s).Did you mean "discountG"?

BO類中屬性名和setter/getter方法名稱不比對,這個一般是由人工修改引起的;

4、支援幾種lombok注解

@Builder、@AllArgsConstructor

5、用異常代替非空驗證?

非空驗證時可以不指定@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)屬性,直接使用@Mapper

6、proto映射時集合為啥總為空?

原因是proto會把repeat修飾的變量後面預設給加上List字尾。是以映射時需特殊指定一下,如下:

List<WorkflowDto> toDtos(List<WorkflowBo> var1);

@Mapping(source = "children", target = "childrenList")
WorkflowDto toDto(WorkflowBo var1);      

7、Timestamp轉date時時間會多8小時

@JsonFormat(pattern="yyyy-MM-dd",  timezone="GMT+8")

@Data
    public static class  StudyDateRange implements Serializable {
        @JsonFormat(pattern="yyyy-MM-dd",  timezone="GMT+8")
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        private Date start;
        @JsonFormat(pattern="yyyy-MM-dd",  timezone="GMT+8")
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        private Date end;
    }
//這主要是時區問題引起的
@Mapping(target = "createdAt" , expression = "java(MapStructMapperUtil.dateToLocalDate(var1.getCtime()))" )      

8、@AfterMapping

@AfterMapping
default void  setLicenseActivationInfoBo(@MappingTarget LicenseActivationRecordBo bo,  ActivationRecordEntity var1) {
    List<LicenseActivationInfoBo> activationInfo = JSONUtil.toList(var1.getActivationInfo(), LicenseActivationInfoBo.class);
    int accountTotal = 0;
    for(LicenseActivationInfoBo item: activationInfo) {
        accountTotal += item.getAccountLimit();
    }
    bo.setAccountLimit(accountTotal);
    bo.setActivationInfo(activationInfo);
}      

9、proto通過優化定義節省傳輸大小

message MyMessage {
  //定義一個枚舉
  enum DataType {
    StudentType = 0;
    WorkerType = 1;
  }
  //用data_type辨別傳的是那一個枚舉
  DataType data_type = 1;
  //标示每次枚舉類型最多隻能出現其中的一個 節省空間
  oneof dataBody {
    Student student = 2;
    Worker worker = 3;
  }

}