2023年12月10日 星期日

JSR-303 Bean Validation

 在以往Bean Validation通常會在service的function寫上好長一段判斷如下


//合法性校驗
  if (StringUtils.isBlank(dto.getName())) {
   throw new XueChengPlusException("課程名稱為空");
  }

  if (StringUtils.isBlank(dto.getMt())) {
   throw new XueChengPlusException("課程分類為空");
  }

  if (StringUtils.isBlank(dto.getSt())) {
   throw new XueChengPlusException("課程分類為空");
  }

  if (StringUtils.isBlank(dto.getGrade())) {
   throw new XueChengPlusException("課程等級為空");
  }

然而當欄位多起來的時候,code看起來就會變得冗長

且如果不同的function都要來一段這個,這些也有許多重複的程式碼其實也有改進空間

而在JavaEE6規範中就定義了參數校驗的規範

它就是JSR-303,它定義了Bean Validation,即對bean屬性進行校驗

SpringBoot提供了JSR-303的支持,它就是spring-boot-starter-validation,它的底層使用Hibernate Validator,Hibernate Validator是Bean Validation 的參考實現。

所以,我們準備在Controller層使用spring-boot-starter-validation完成對請求參數的基本合法性進行校驗。

以下的組合是可以讓不同的controller使用不同組的校驗文字
我們在專案中的exception包定出GlobalExceptionHandler和ValidationGroups



GlobalExceptionHandler

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
    @ResponseBody
    @ExceptionHandler(XueChengPlusException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse customException(XueChengPlusException e) {
        log.error("【系統異常】{}",e.getErrMessage(),e);
        return new RestErrorResponse(e.getErrMessage());

    }

    @ResponseBody
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse exception(Exception e) {

        log.error("【系統異常】{}",e.getMessage(),e);

        return new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrMessage());

    }

    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse methodArgumentNotValidException(MethodArgumentNotValidException e) {

        BindingResult bindingResult = e.getBindingResult();
        List msgList = new ArrayList<>();
        bindingResult.getFieldErrors().stream().forEach(item->{
            msgList.add(item.getDefaultMessage());
        });
        String msg = StringUtils.join(msgList, ",");
        log.error("【系統異常】{}",msg);
        return new RestErrorResponse(msg);

    }
}


ValidationGroups

public class ValidationGroups {
    public interface Insert{};
    public interface Update{};
    public interface Delete{};
}

目前將ValidationGroups分成新增, 更新, 刪除三個類別

在bean上設置的檢核訊息如下


@Data
@ApiModel(value="AddCourseDto", description="新增課程基本信息")
public class AddCourseDto {

 @NotEmpty(groups = {ValidationGroups.Insert.class},message = "新增課程名稱不能為空")
 @NotEmpty(groups = {ValidationGroups.Update.class},message = "修改課程名稱不能為空")
 @ApiModelProperty(value = "課程名稱", required = true)
 private String name;
 ...
 }

然後使用上, 我們在controller就可以這樣寫, 比方說我們此類為新增 就使用Insert @Validated({ValidationGroups.Insert.class})


    @ApiOperation("新增課程基礎信息")
    @PostMapping("/course")
    public CourseBaseInfoDto createCourseBase(@RequestBody @Validated({ValidationGroups.Insert.class}) AddCourseDto addCourseDto){
        //獲取到用戶所屬機構id
        Long companyId = 1232141425L;
        return courseBaseInfoService.createCourseBase(companyId,addCourseDto);
    }

2023年12月1日 星期五

202312 思考人生方向日誌

轉軟體工程師 是201805

至今5年7個月, 工作約4年3個月

其中有

5個月進修android 5個月進修托福 1個月資料結構

5個月是工作轉換期(差不多轉換6次)

大致上被搞兩次, 一次加班太重, 兩次任務結束沒事做, 兩次被薪水更高機會挖走

真是超級波折, 以至於說, 忙著面試, 忙著適應 也是花了不少時間

以目前年薪來說102 勉勉強強及格, 也是算進了外商只是是駐點


本來練完英文, 想直接走國外工作

但是面試下來, 真正能開高的公司考的演算法考題及系統設計 高流量系統問答

這部分我還是有欠缺

還好在國泰時有機會讓我進修一下redis分布式鎖, 算是開啟了高併發的門

只是說還沒那麼熟練, 也還沒把學到的整理成系統就是, 打算等過幾個專案再來整理優良範例


今年過35了, 五子都沒半個影, 而面對現實的我, 其實壓力很大,

因為不小心還是把前女友留在身邊, 畢竟真的很愛她,

只是說如果要有小孩(後代)的話, 要另外找對象生了,


可能像別人就直接分手找下一個, 只是我捨不得

但是隨之而來, 在已有女友的情況下, 要再找一個女友

條件將會變得相當苛刻

並且可預期女生會需要我經濟上滿足她

每月若是3萬, 那除上0.05, 就是本金要600萬的年利率才足夠養小三

大概~是這樣想

然而, 工作這麼久, 其實有點疲乏, 白天上班有點累

也還是100公斤左右的體重, 是說體力比以前差不少

樣貌也是不太良好,

說實在, 真的壓力很大


還好債卷ETF有小賺, 算是站好了好買點

如果能賺個40萬出來, 對於我目前的困境幫助不少


看一下工作可能還是要找外商高流量工作好點

進修上安排, 可能平日都要有code練習(刷題)

就是說需要有make thing easier的安排


昨天看到說如果慾望足夠大, 方向也會變得相對紀律起來

如果已經得到滿足相對來說會比較躺(這部分要小心)


預計是說 目前先+1天運動

變成一, 三, 六 運動

二, 日刷題 六開局寫專案

四約人吃飯, 五六日玩電腦

上週六量97.5公斤, 希望體重78, 差不多一個月瘦3.3就行, 差不多一星期一公斤

先以目前的安排看看能不能維持一個月, 等後面再慢慢把其他安排加進來






[leetcode] [KMP] KMP

ABCDABD... ABCDABF... 簡單的說, 傳統解兩字串匹配部分 可能會來個雙迴圈, 哀個比對, 當不匹配的時候, 會將下方列再後移1位 然後不匹配再後移 然而 如果像上放已經有4個屬於匹配的字串, 她就應該直接往後移四位來匹配, 而不是只移動1位 隱藏的思維是, 當...