+1

Dropwizard View với Thymeleaf template engine

Tiếp tục với bài viết ở lần trước, https://viblo.asia/p/restful-api-with-java-framework-dropwizard-do-rop-wi-dot-ByEZkJwxKQ0. Mình đã tạo một ứng dụng rest API đơn giản với dropwizard

Hôm nay mình sẽ tiến hành thêm config để có thể dùng thymeleaf với dropwizard!

Thêm một vài dependency vào file pom.xml.

        <dependency>
            <groupId>io.dropwizard</groupId>
            <artifactId>dropwizard-views</artifactId>
            <version>1.2.6</version>
        </dependency>

        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>3.0.1.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-java8time</artifactId>
            <version>3.0.0.RELEASE</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>io.dropwizard</groupId>
            <artifactId>dropwizard-assets</artifactId>
            <version>${dropwizard.version}</version>
        </dependency>
        <!-- bootstrap -->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.1.3</version>
        </dependency>

Mình tạo một package config/thymeleaf trong và tiến hành thêm các file class sau để config thymeleaf:

BeanContext.java

ClassResourceTemplateResolver.java

ThymeleafConfigurator.java

ThymeleafViewRenderer.java

Ở trong package resource mình tạo thêm package META-INF/services. Thêm vào đấy file io.dropwizard.views.ViewRenderervới nội dung như sau !!

com.tungpv.example.config.thymeleaf.ThymeleafViewRenderer

là nội dung trỏ đến class ThymeleafViewRenderermình tạo ở phía trên!

Thêm như sau vào class AppConfig

    @JsonProperty("views")
    public Map<String, Map<String, String>> views;

Thêm như sau vào file config.yml

views:
  .html:
    cache: false
    prefix: "/templates"

Thêm như sau vào initialize trong MainApplication class :

bootstrap.setConfigurationSourceProvider(
                new SubstitutingSourceProvider(
                        bootstrap.getConfigurationSourceProvider(),
                        new EnvironmentVariableSubstitutor(false)
                )
        );
        bootstrap.addBundle(new ViewBundle<AppConfig>(ImmutableList.of(new ThymeleafViewRenderer())) {
            @Override
            public Map<String, Map<String, String>> getViewConfiguration(final AppConfig configuration) {
                return configuration.views;
            }
        });

        bootstrap.addBundle(new AssetsBundle("/templates/com/tungpv/example/resource/web/assets/", "/assets"));
        bootstrap.addBundle(new AssetsBundle("/META-INF/resources/webjars", "/webjars", null, "webjars"));

Như vậy là đã có thể dùng thymeleaf với dropwizard!

Mình sẽ tạo class UserViewResource.java như sau để trả về view chứ không phải trả về json.

Tạo một class UserView.java extends io.dropwizard.views.View.

Tạo file index.html để hiện thị danh sách user.

Và cuối cùng mình đăng ký UserViewResource vào environment ở hàm void run:

    @Override
    public void run(AppConfig configuration, Environment environment) {

        environment.jersey().register(new UserResource());
        environment.jersey().register(new UserViewResource());
    }

Và kết quả khi mình truy cập http://localhost:8080/users như sau :

Toàn bộ việc tiến hành config thymeleaf các bạn có thể xem code ở đây ! https://github.com/tungpv-0974/example-dropwizard/pull/2/files

Và source code của toàn bộ example này mình để ở đây ! https://github.com/tungpv-0974/example-dropwizard


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí