Migrate webapp sử dụng Spring Boot

Spring Boot Starters & Common Configurations

Mục tiêu

Luyện tập sử dụng Spring Boot trên dự án có nhiều khía cạnh công nghệ.

Hướng dẫn

Bước 1: khởi động dự án stock

Tải dự án stock tại file đính kèm. Thực hiện các bước cài đặt cần thiết để khởi động dự án. Lưu ý, dự án đã được cấu hình bằng externalized config (xem file AppConfig). Để có cấu hình, hãy copy file “sample.application.properties” thành file “application.properties” sau đó sửa cấu hình nếu cần thiết.

Bước 2: thay đổi các phụ thuộc nguyên bản thành các gói starter tương ứng

Dự án đang sử dụng Spring MVC, Thymelead, Security, Spring Data, hãy thay thế file build.gradle hiện tại thành file build phiên bản Spring Boot (sử dụng Spring Initializer để tham khảo). Các gói starter cần thiết như sau:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
}

Bước 3: sửa các lỗi xảy ra do nâng cấp phiên bản JPA

Dự án cũ sử dụng Spring Data JPA phiên bản 4. Sau khi migrate, Spring Boot Starter JPA sử dụng Spring Data JPA phiên ban 5, do đó API của repository sẽ khác một chút. Tại class “AbstractEntityServiceImplWithSpringData” sẽ cần sửa các lời gọi sử dụng API cũ sang API mới:

.findOne(id); -----> .findById(id).orElse(null);\
.save(Es); -----> .saveAll(Es);
.exists(id); ----->.existsById(id);
...

Bước 4: thay thế các class cấu hình cũ bằng Spring Boot App

Spring Boot không cần các class servlet hook. Có thể xóa các class AppConfig, AppInit, SecurityWebApplicationInitializer, SecurityWebApplicationInitializer. Thay thế chúng bằng một class Spring Boot App như sau:

@SpringBootApplication
public class GranDemonstrationApplication {

public static void main(String[] args) {
SpringApplication.run(GranDemonstrationApplication.class, args);
}

@Bean
// -- các beans cũ
}

Các cấu hình của riêng ngữ cảnh web, như formatter, interceptor, đặt vào một class implement WebMvcConfigurer:

@Configuration
class WebConfig implements WebMvcConfigurer, ApplicationContextAware {

  private ApplicationContext appContext;

  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    appContext = applicationContext;
  }

  @Override
  public void addFormatters(FormatterRegistry registry) {
    ProvinceService provinceService = appContext.getBean(ProvinceService.class);
    Formatter provinceFormatter = new ProvinceFormatter(provinceService);
    registry.addFormatter(provinceFormatter);
  }

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
    interceptor.setParamName("lang");
    registry.addInterceptor(interceptor);
  }
}

Tại cấu hình security, bổ sung password encoder, do Spring Boot starter security không sử dụng encoder default nữa:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
    auth.inMemoryAuthentication()
                                           .withUser("user1").password(encoder.encode("secret")).roles(Roles.USER)
.and()
    .withUser("user2").password(encoder.encode("secret")).roles(Roles.STAFF);
}

Bước 5: di chuyển các template vào đúng vị trí

Gói starter web mặc định coi vị trí đặt template là tại resources/templates (trừ khi tự cấu hình lại), hãy di chuyển các template hiện tại vào thư mục này.

Bước 6: khôi phục các cấu hình ngoại hóa khác

Spring sử dụng ngôn ngữ ngoại hóa cấu hình riêng, hãy chuyển các cấu hình hiện có trong application.properties thành theo mẫu sau (tham khảo sample.boot.application.properties):

spring.datasource.url=jdbc:mysql://localhost:3306/cms
spring.datasource.username=root
spring.datasource.password=123456
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.implicit_naming_strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl
spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.properties.javax.persistence.validation.mode=none
spring.thymeleaf.encoding=utf-8

Sau đó khởi động chương trình spring boot và quan sát kết quả.

Leave a Reply

Your email address will not be published. Required fields are marked *