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

Nguồn: Viblo

Bình luận
Vui lòng đăng nhập để bình luận
Một số bài viết liên quan