Конфигурация Spring Boot + Thymeleaf + Одуванчик не работает

Я использую Spring Boot с Thymeleaf, и теперь я хочу добавить данные Dandelion, но это не работает.

Вот мои maven зависимости:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.1.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

<!-- Dandelion -->
<dependency>
    <groupId>com.github.dandelion</groupId>
    <artifactId>datatables-thymeleaf</artifactId>
    <version>0.10.1</version>
</dependency>

Я следую этому руководству http://dandelion.github.io/dandelion/docs/installation/thymeleaf.html и настроил следующие компоненты:

@SpringBootApplication
public class Application {

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

    @Bean
    public FilterRegistrationBean dandelion() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new DandelionFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }

    @Bean
    public ServletRegistrationBean dandelionServlet() {
        ServletRegistrationBean registrationBean = new ServletRegistrationBean();
        registrationBean.setServlet(new DandelionServlet());
        registrationBean.addUrlMappings("/dandelion/*");
        return registrationBean;
    }

    @Bean
    public ServletContextTemplateResolver defaultTemplateResolver() {
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
        resolver.setTemplateMode("HTML5");
        resolver.setPrefix("/WEB-INF/templates/");
        resolver.setSuffix(".html");
        resolver.setCharacterEncoding("UTF-8");
        resolver.setCacheable(false);

        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(resolver);
        engine.addDialect(new DataTablesDialect());

        return resolver;
    }

}

Я сделал этот HTML для тестирования:

<!doctype html>
<html 
 xmlns:th="http://www.thymeleaf.org" 
 xmlns:ddl="http://github.com/dandelion">
<head>
 <link type="text/css" href="/stylesheets/dataTables.css" media="screen" rel="stylesheet" />
 <script src="/javascripts/vendor/jquery191.js" type="text/javascript"></script>
 <script src="/javascripts/vendor/dataTables.js" type="text/javascript"></script>
</head>
<body>
 <br/>
 <table id="myTableId" ddl:table="true" ddl:url="@{/clientes}">
    <thead>
       <tr>
          <th ddl:property="telefone">Telefone</th>
          <th ddl:property="nome">Nome</th>
       </tr>
    </thead>
 </table>
</body>
</html>

Я думаю, что сервлет Одуванчика не называется. Пространство имен не обрабатывается.

1 ответ

Решение

Есть несколько ошибок. Большинство из них точно такие же, как я делал, когда впервые использовал таблицы данных одуванчиков.:)

Я пишу полные простые примеры для каждого из приведенных ниже кодов, чтобы в будущем их можно было использовать. Поэтому убедитесь, что вы добавляете в свой проект только недостающие

Сначала добавьте обе эти зависимости в свой maven. (У вас уже есть первый. Поэтому добавьте позже.)

<dependency>
    <groupId>com.github.dandelion</groupId>
    <artifactId>datatables-thymeleaf</artifactId>
    <version>0.10.1</version>
</dependency>
<dependency>
    <groupId>com.github.dandelion</groupId>
    <artifactId>datatables-spring3</artifactId>
    <version>0.10.1</version>
</dependency>

Затем добавьте эти конфигурации. Вы должны создать Бобы для диалектов. Я думаю, что вы пропустили это..

@Configuration
public class DandelionConfig {

    @Bean
    public DandelionDialect dandelionDialect() {
        return new DandelionDialect();
    }

    @Bean
    public DataTablesDialect dataTablesDialect(){
        return new DataTablesDialect();
    }

    @Bean
    public Filter dandelionFilter() {
        return new DandelionFilter();
    }

    @Bean
    public ServletRegistrationBean dandelionServletRegistrationBean() {
        return new ServletRegistrationBean(new DandelionServlet(), "/dandelion-assets/*");
    }
}

И вид может быть примерно таким

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:ddl="http://www.thymeleaf.org/dandelion"
      xmlns:dt="http://www.thymeleaf.org/dandelion/datatables">
<head lang="en"></head>
<body>
    <table id="myTableId"
        dt:table="true"
        dt:url="@{/clientes}"
        dt:serverside="true"
        dt:processing="true">
          <thead>
            <tr>
              <th dt:property="telefone">Telefone</th>
              <th dt:property="nome">Nome</th>
            </tr>
          </thead>
     </table>
</body>
</html>

Здесь вы используете обработку на стороне сервера. Это требует, чтобы ваш контроллер имел отображение на /clientes который возвращает DatatablesResponse

@Override
@RequestMapping(value = "/clientes")
@ResponseBody
public DatatablesResponse<MyObject> data(HttpServletRequest request){
    List<MyObject> myObjectList = ... //logic to fetch a list of objects

    DatatablesCriterias criterias = DatatablesCriterias.getFromRequest(request);
    DataSet<MyObject> dataSet = new DataSet<>(myObjectList, (long)myObjectList.size(), (long)myObjectList.size());
    return DatatablesResponse.build(dataSet, criterias);
}

MyObject - это объект, который вы передаете в таблицы данных одуванчика.

public class MyObject {
    private String telefone;
    private String nome;

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
}
Другие вопросы по тегам