Chia sẻ nếu các bạn thấy thắc mắc về sao anh ý viết interface cho service. A ý đang tuân thủ về DI. ( Phụ thuộc đảo). 1. Nếu bạn viết 1 class UserService và inject vào controller, thì về sau bạn muốn đổi thằng userService này thì bạn sẽ phải vào controller để thay đổi => Đối với cách trên thì bạn chỉ cần impl lại các method mà interface nó nêu ra là xong. => Như thế dễ maintain. Ngoài ra còn ưu điểm gì nữa không thì mong a chia sẻ ạ.
Theo mình khi đã tách method thì nên để tham số là class detail luôn để đỡ fai dùng instanceof, và vẫn cần log detail lỗi để dev backend biết chính xác lỗi ở line nào.
Sao em làm y vậy mà f5 lại swagger thì nó lại lỗi anh ạ. Nó ném lỗi như này ạ: NoSuchMethodError: 'void org.springframework.web.method.ControllerAdviceBean.(java.lang.Object)'
Dạ cho em hỏi là mình ném ra exception ở tầng service và handle ở tầng controller là chỉ là ví dụ a làm trong video này thôi hay đó là best pratices và nên áp dụng luôn ạ. Em cảm ơn ạ
@@tayjava case em cảm ơn anh, nhưng mà case 1,2 không có anh ạ, case 3 trả về string thì mới có. Với cho em hỏi anh cứ implement Serializable làm gì vậy em bỏ mà nó vẫn chạy bình thường
@@naisi1387 trong series này a có giải thích ở mấy bài rồi mà! DTO là Data Transfer Object, mỗi DTO là mô tả của 1 json data, json này truyền đi trên môi trường internet nên nó phải chuyển thành byte nhị phân mới truyền đi đc nên cần Serializable và convert từ byte thành json thì gọi là deserializable. Nôm na là thế! E đọc thêm trên mạng nhé, chát hơi mỏi tay e ạ
Hi anh, cho em hỏi 1 chút ở phần ConstraintViolationException. thì khi thay updateUser pathvariable từ 1 về 0 thì em chạy thử thì k hiện console error lên như anh? debug cũng k vào, mà để lại 1 thì vẫn update thành công. thì sao bắt đc exception đó đây anh?
@@tayjava em dùng @Min(value=1, message = "xxx") e đã test đang hiểu validate khi nhập 0 vào vẫn bị bắt nhưng k đưa ra exception constraints như video thôi a. Return về 400 trên post main. Console thì k in ra gì ạ.
@@theongtran3920 có 2 giải pháp nhé 1. E git clone code của a về để tìm hiểu xem e thiếu gì mà nó ko chạy 2, e thắp hương xôi gà, biết đâu nó lại chạy, kaka… Chúc e may mắn !
@@tayjava dạ em cám ơn anh. Để e clone về nghịch. Hoặc clone hoặc custom @MinCustom @@. Cám ơn a nhiều những chia sẻ a rất hay và bổ ích. Mong anh ra nhiều video thêm ạ. Chúc a nghỉ lễ vui vẻ nhé!
anh ơi đoạn bắt MethodArgumentNotValidException thì em nghĩ mình có thể dùng ex.getBindingResult() để bắt được tất cả các field lỗi cùng 1 lúc luôn ạ code: else if(e instanceof MethodArgumentNotValidException ex) { errorResponse.setError("Invalid Payload"); Map errors = new HashMap(); ex.getBindingResult().getAllErrors().forEach((error) -> { String fieldName = ((FieldError) error).getField(); String errorMessage = error.getDefaultMessage(); errors.put(fieldName, errorMessage); }); errorResponse.setMessage(errors.toString()); } output: "message": "{lastName=lastName must be not null, firstName=firstName must be not blank}"
@@tayjava if (e instanceof MethodArgumentNotValidException) { /* int start = message.lastIndexOf("[") + 1; int end = message.lastIndexOf("]") - 1; message = message.substring(start, end); */ var ret = ((MethodArgumentNotValidException) e).getBindingResult().getFieldError().getDefaultMessage(); errorResponse.setError("Invalid Payload"); errorResponse.setMessage(ret); // đây nhé thầy giáo
@@tayjava code đây nha: if (e instanceof MethodArgumentNotValidException) { /* int start = message.lastIndexOf("[") + 1; int end = message.lastIndexOf("]") - 1; message = message.substring(start, end); */ var ret = ((MethodArgumentNotValidException) e).getBindingResult().getFieldError().getDefaultMessage(); errorResponse.setError("Invalid Payload"); errorResponse.setMessage(ret);
@@tayjava anh cho em hỏi là @ApiRespones em thấy trong sourceCode có phải mỗi khi mình khai báo function bắt 1 exception là tiêu chuẩn cần phải khai báo trước đúng không anh. Em ko thấy trong video anh đề cập đến vấn đề đấy nhưng trong source có ạ.
cảm ơn a nhiều. học được nhiều thứ từ anh💗
Chia sẻ nếu các bạn thấy thắc mắc về sao anh ý viết interface cho service.
A ý đang tuân thủ về DI. ( Phụ thuộc đảo).
1. Nếu bạn viết 1 class UserService và inject vào controller, thì về sau bạn muốn đổi thằng userService này thì bạn sẽ phải vào controller để thay đổi => Đối với cách trên thì bạn chỉ cần impl lại các method mà interface nó nêu ra là xong. => Như thế dễ maintain.
Ngoài ra còn ưu điểm gì nữa không thì mong a chia sẻ ạ.
Đảm bảo tuân thủ design pattern của spring boot, và đảm bảo tính inheritance và encapsulation của java e nhé
con khi viet test thi ngta lai k hay impl ban ak
Hay quá anh. Anh chuyên về backend java hay sao vậy a? Thấy mấy bài đúng mấy cái kiến thức hay
Đúng rồi em, A chuyên làm backend các hệ thống siêu to khổng lồ, bảo mật cao. Hy vọng nó hữu ích với em
Học xong playlist của sư phụ có thể đi xin việc rồi
Nắm vững lý thuyết vào ko toang đấy e
dạ anh cho em hỏi handle Exception bằng Enum có phải là 1 best pratice không a
Đúng rồi e
Theo mình khi đã tách method thì nên để tham số là class detail luôn để đỡ fai dùng instanceof, và vẫn cần log detail lỗi để dev backend biết chính xác lỗi ở line nào.
Ý bác là chỉ luôn cái DTO hay Controller nào lỗi đúng ko nhỉ ? E hiểu đúng ý bác chứ !
@@tayjava ko ý tôi là handle...(MethodException e, ...) chứ ko phải Exception e, ở GlobalExceptionHandler ý
E hiểu ý bác rồi nhé !
Sao em làm y vậy mà f5 lại swagger thì nó lại lỗi anh ạ. Nó ném lỗi như này ạ: NoSuchMethodError: 'void org.springframework.web.method.ControllerAdviceBean.(java.lang.Object)'
E xem source code của anh xem sao, nếu ko đc gửi link git a check cho nha
do version đó. b thử lên version pringdoc-openapi-starter-webmvc-ui xem
@@ucbui2332 nếu e dùng bản spring boot 3.3.5 trở về trước thì ko lỗi nhé! Còn từ bản 3.4 trở đi là bị lỗi e ạ! Hôm nọ s cũng bị fix mất mấy tiếng !
@@tayjava Dạ em đưa về bản 3.3.5 thì xài dc rồi ạ
@ okie e nha
Dạ cho em hỏi là mình ném ra exception ở tầng service và handle ở tầng controller là chỉ là ví dụ a làm trong video này thôi hay đó là best pratices và nên áp dụng luôn ạ. Em cảm ơn ạ
Best practice nhé e!
@@tayjava Dạ em cảm ơn anh ạ
Không có đoạn bắt lỗi ở phần enum anh nhỉ
Có chứ, e xem trong file GlobalExceptioHandler ấy
@@tayjava case em cảm ơn anh, nhưng mà case 1,2 không có anh ạ, case 3 trả về string thì mới có. Với cho em hỏi anh cứ implement Serializable làm gì vậy em bỏ mà nó vẫn chạy bình thường
@@naisi1387 trong series này a có giải thích ở mấy bài rồi mà! DTO là Data Transfer Object, mỗi DTO là mô tả của 1 json data, json này truyền đi trên môi trường internet nên nó phải chuyển thành byte nhị phân mới truyền đi đc nên cần Serializable và convert từ byte thành json thì gọi là deserializable. Nôm na là thế! E đọc thêm trên mạng nhé, chát hơi mỏi tay e ạ
Hi anh, cho em hỏi 1 chút ở phần ConstraintViolationException. thì khi thay updateUser pathvariable từ 1 về 0 thì em chạy thử thì k hiện console error lên như anh? debug cũng k vào, mà để lại 1 thì vẫn update thành công. thì sao bắt đc exception đó đây anh?
E có dùng @Min(“0”) ko nhỉ ?
@@tayjava em dùng @Min(value=1, message = "xxx") e đã test đang hiểu validate khi nhập 0 vào vẫn bị bắt nhưng k đưa ra exception constraints như video thôi a. Return về 400 trên post main. Console thì k in ra gì ạ.
@@theongtran3920 có 2 giải pháp nhé
1. E git clone code của a về để tìm hiểu xem e thiếu gì mà nó ko chạy
2, e thắp hương xôi gà, biết đâu nó lại chạy, kaka…
Chúc e may mắn !
@@tayjava dạ em cám ơn anh. Để e clone về nghịch. Hoặc clone hoặc custom @MinCustom @@. Cám ơn a nhiều những chia sẻ a rất hay và bổ ích. Mong anh ra nhiều video thêm ạ. Chúc a nghỉ lễ vui vẻ nhé!
Okie e nha
Anh cho em xin hình ảnh sơ đồ của Exception đc k ạ!
Em xin cảm ơn !
Cho a email e ơi a gửi cho
Anh đang làm ở cty nào thế a ?
Cảm ơn e đã quan tâm! Haha..
Công ty làm việc thì ai tiết lộ bao giờ bạn, hỏi câu tế nhị vậy
anh ơi đoạn bắt MethodArgumentNotValidException thì em nghĩ mình có thể dùng ex.getBindingResult() để bắt được tất cả các field lỗi cùng 1 lúc luôn ạ
code:
else if(e instanceof MethodArgumentNotValidException ex) {
errorResponse.setError("Invalid Payload");
Map errors = new HashMap();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
errorResponse.setMessage(errors.toString());
}
output:
"message": "{lastName=lastName must be not null, firstName=firstName must be not blank}"
Okie em, để a update chỗ đó nha
hóa ra bấy lâu nay em toàn handler exception chay :_(
Cái này khó lắm đấy nha, e nghiên cứu sâu mới hiểu hết đc
Cắt chuỗi thiếu chuyên nghiệp, lấy theo object thì hay hơn
anh có thể cho em xin file tổng hợp các exception được không ạ
Để trong source code ấy e, phần mô tả video nhé
@@tayjava em tìm file vẽ lý thuyết á anh
Để lại email a gửi cho nha
Mình từng thấy cách xử lý lấy message error hay hơn cắt chuỗi
Nếu được bác share cho e với để e thử, e cũng ko thấy cách ấy hay nhưng nó dẽ làm bác ợ
@@tayjava bạn cho xin file ở postman được không để tôi test và viết lại cho
@@tayjava if (e instanceof MethodArgumentNotValidException) {
/*
int start = message.lastIndexOf("[") + 1;
int end = message.lastIndexOf("]") - 1;
message = message.substring(start, end);
*/
var ret = ((MethodArgumentNotValidException) e).getBindingResult().getFieldError().getDefaultMessage();
errorResponse.setError("Invalid Payload");
errorResponse.setMessage(ret);
// đây nhé thầy giáo
@@nvtmjfan Bác cho nhà em xin cái email nhé ! Với cả source code em để phần mô tả video nha bác, Bác cứ chạy docker là có database bác nha
@@tayjava code đây nha: if (e instanceof MethodArgumentNotValidException) {
/*
int start = message.lastIndexOf("[") + 1;
int end = message.lastIndexOf("]") - 1;
message = message.substring(start, end);
*/
var ret = ((MethodArgumentNotValidException) e).getBindingResult().getFieldError().getDefaultMessage();
errorResponse.setError("Invalid Payload");
errorResponse.setMessage(ret);
Anh có thể cho em xin sơ đồ exception được ko ạ. Em có gửi email cho anh rùi ạ.
Okie em
@@tayjava anh cho em hỏi là @ApiRespones em thấy trong sourceCode có phải mỗi khi mình khai báo function bắt 1 exception là tiêu chuẩn cần phải khai báo trước đúng không anh. Em ko thấy trong video anh đề cập đến vấn đề đấy nhưng trong source có ạ.
@@nguyenlam5439 a ra video theo series cho nên vào danh sách phát rồi xem lại từ đầu nhé
@@tayjava anh gửi em sơ đồ exception được ko ạ. Anh mới gửi phần lombook ạ.
A chưa tìm ra là a để đâu nữa