Posts

Showing posts with the label SpringBoot

Swagger trong springboot

Bạn đã từng phát triển API restful webservice bằng Spring rồi sau đó lại phải viết tài liệu mô tả từng API với tham số param và mã lỗi trả về Nếu bạn đã từng thì bài viết này sẽ rất hữu ích cho bạn với cách tiếp cận mới Bạn chỉ việc phát triển API theo đúng chuẩn rồi sau đó enable Swagger trong hệ thống SpringBoot của bạn Swagger sẽ tự động đọc code và xuất ra tài liệu mô tả API cho bạn, rồi bạn chỉ việc gửi đường dẫn Swagger cho Frontend-developer tham khảo Phần cấu hình tôi sẽ hướng dẫn bạn sau. Rất đơn giản để thực hiện cấu hình Swagger trên SpringBoot @WebService @Api (value =  "Emailssssssss" ) @Path (value =  "/v1.0/emails" ) public   class   erviceImpl  extends   BaseWebService  implements   EmailService {        private   static   Logger logger = LogManager.getLogger(xxxxxxxImpl. class );        @POST      @ApiOperation (value ...

@Transactional in SpringBoot

Image
Phần này chúng ta sẽ tìm hiểu sức mạnh một lần nữa của @Transactional trong SpringBoot Như bạn đã biết khi một hệ thống tra tấn 1 DB đồng nghĩa với việc khả năng tương tranh dữ liệu trong 1 Giao dịch trong DB xảy ra là rất cao. Tuy nhiên trong thực tế các dự án nhỏ chúng ta thường bỏ qua vấn đề cô lập transaction khi code, hoặc một số là do developer không hiểu hoặc không để ý đến tầm ảnh hưởng của việc tương tranh dữ liệu trong DB. Các bạn nếu là người mới bắt đầu tìm hiểu thì có lẽ bài này sẽ giúp ích phần nào cho bạn hiểu về Cô lập transaction  Bạn có thể đọc wiki để hiểu rõ về các tình huống có thể xảy ra với một transaction https://en.wikipedia.org/wiki/Isolation_(database_systems) Isolation (database systems)  là một trong 4 tính chất ACID mà một DB cần có.  Tôi sẽ đi thẳng vào bốn tình huống  Dirty reads Tình huống này giống như kiểu ví dụ sau đây Bạn có thể thấy hệ thống của bạn đang có 2 transaction cùng truy cập tới một bản ghi có ID=1  Khi tr...

@PropertySource vs @ConfigurationProperties

Trong bài này tôi sẽ hướng dẫn bạn cách tiêm giá trị từ file *.properties vào code trong spring về cơ bản là tôi sẽ tiêm các giá trị như String hoặc số int đơn giản cho bạn dễ hiểu 1. Cách thứ nhất với  @PropertySource bạn dễ dàng làm được điều này, cái tên nó đã gợi nhớ đến tính năng Nguồn thuộc tính tôi ví dụ bạn có một file demo.properties  // đặt cùng cấp với file application.properties trong thư mục resources nội dung file như sau hobby=Reading sex=male mail.from =test@test.com mail.host =test@test.com mail.port =25 mail.security.userName =test mail.security.password =test và class bên dưới được tiêm giá trị vào @Component @PropertySource("classpath:demo.properties") public class DemoProperties { @Value(value = "${mail.from}") String from; @Value(value = "${sex}") String sex; } 2. Cách thứ 2 dùng @ConfigurationProperties cách này bắt buộc phải có setter và getter nhé @Configuration @PropertySource("cl...

@Configuration & @Bean

Ref: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html https://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch03.html Khi bạn khai báo 1 class với Annotation @Configuration đồng nghĩa với bạn nói với Spring rằng hãy coi class này như là 1 trong những nguồn khởi tạo Bean nhé  Nó giống như là 1 file xml mà khai báo các bean trong đó. Vậy các bean khai báo thế nào trong class này Cách khai báo là bạn dùng @Bean để khai báo các phương thức trả về các đối tượng Bean, các thể hiện này sẽ được đăng ký vào ApplicationContext @Configuration public class HelloWorldConfig { @Bean public HelloWorld helloWorld(){ return new HelloWorld(); } } Đoạn code trên nó tương đương với <beans>    <bean id = "helloWorld" class = "com.mp.HelloWorld" /> </beans> Dưới đây là một ví dụ khác về cách tiêm sự phụ thuộc vào bean @Configuration public class...

@EnableTransactionManagement và @Transacitonal

Khi bạn cần sự hỗ trợ quản lý Transaction từ Spring Framework Hãy nhớ đến @EnableTransactionManagement Thật ra tôi áp dụng SpringBoot v2.1.2.RELEASE cũng không cần áp dụng Annotation này(vì quên). Nhưng thấy vẫn chạy ổn với @Transactional :-)  Với annotation này, bạn đang nói với Spring rằng bạn cần Spring quản lý Transaction cho bạn thay vì bạn sẽ làm việc đó thủ công Done  Nhưng để Spring hiểu rằng một Transaction nào thì Spring sẽ quản lý thì bạn cần phải đánh dấu các transaction cho SpringBoot hiểu  với  @Transacitonal  javax.transaction.Transactional; or org.springframework.transaction.annotation.Transactional Cả 2 annotation này để chạy ổn với rollback hoặc noRollback Nếu bạn đặt level này ở mức class khai báo (cạnh @Service) thì nó sẽ có sức ảnh hươngr đến toàn bộ method khai báo bên trong class này  Nếu bạn muốn Overwrite  ghi đè cho một phương thức nào đó thì bạn đặc thêm @Transactional ở level method.  Done Bây giờ thì bạn ...

data.sql and schema.sql in springboot

liquibase in Spring Boot

Image
Liquibase Liquibase dùng để quản lý thay đổi trong cơ sở dữ liệu cho dự án. Về vai trò thì gần giống như Script SQL dùng để khởi tạo, chèn, cập nhật cơ sở dữ liệu Vấn đề là đoạn script chỉ phù hợp với 1 csdl File change-log liquibase thì 1 file change-log   phù hợp với các hệ cơ sở dữ liệu khác nhau như MySQL , Oracle, PostgreSQL Ví dụ: Script SQL : insert (a,b,c) into (name, age,address) Liquibase:   chèn (a,b,c) (name,age,address) Khi đọc file Liquibase thì sẽ convert ra câu lệnh tương ứng với csdl tương ứng, lên việc viết một đoạn xml bằng liquibase sẽ được dịch ra tương ứng với các csdl dùng trong ứng dụng -----------------------SET-UP for dependency---------------------------- Cần tối thiểu ---- Dependency liquibase <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency> ---- dependency Liên quan đến kết nối CSDL: Ví dụ cho MySQL, hoặc Oracle...