Flux не отображается в Thymeleaf, если включена Spring Web Security

Я пытаюсь показать поток строк из моего контроллера в представление в Thymeleaf, но я получаю только ReactiveDataDriverContextVariable в представлении.

Я использую Spring Boot 2

Это мой код контроллера

@GetMapping("/demo")
fun demo(model: Model): String{
    val data = Flux.just("ONE", "TWO", "THREE", "FOUR")
    model.addAttribute("data", ReactiveDataDriverContextVariable(data,1))
    return "demo"
}

И это мой код шаблона Thymeleaf

    <table class = "table table-striped table-responsive">
        <tr th:each = "c: ${data}">
            <td th:text = "${c}">...</td>
        </tr>
    </table>

Насколько я знаю, ReactiveDataDriverContextVariable должен перевести тимелеаф в режим, управляемый данными, и показать список из четырех строк, но я просто получаю этот вывод:

org.thymeleaf.spring5.context.webflux.ReactiveDataDriverContextVariable@30ece48

Я уверен, что есть что-то, что мне не хватает заранее спасибо

РЕДАКТИРОВАТЬ 1

Кажется, проблема с Spring Security

у меня включена эта конфигурация

@EnableWebSecurity
class SecurityConfig : WebSecurityConfigurerAdapter() {

    override fun configure(http: HttpSecurity) {
        http.authorizeRequests()
                .antMatchers("/demo")
                .permitAll()
    }

}

Когда я удаляю конфигурацию и зависимость Spring Security, все работает нормально, но я хотел бы защитить веб-приложение.

Любые идеи?

Ваше использование кажется правильным, но, насколько я знаю, ReactiveDataDriverContextVariable доступен в Thymeleaf 3.0. Пожалуйста, опубликуйте файл pom.

Ahmet 12.02.2019 10:17

Привет, @Ahmet, я использую Gradle, поэтому публикую для вас отчет о зависимости: org.thymeleaf:thymeleaf:3.0.11.RELEASE (selected by rule) Спасибо.

Cyberdev 12.02.2019 10:34

Я подозреваю ReactiveDataDriverContextVariable(data,1). Особенно второй элемент конструктора. Попробуйте увеличить размер буфера, например ReactiveDataDriverContextVariable(data,5).

Ahmet 12.02.2019 12:18

Пробовал раньше и имел тот же результат, только переменную контекста, когда она должна быть 4 строки. Может быть, я пропускаю какую-то конфигурацию?

Cyberdev 12.02.2019 12:30

Что касается части листьев тимьяна; там все в порядке. Это может быть проблема с конфигурацией или зависимостями. Другое дело может быть инициализация и присвоение переменной data. Я не в kotlin, поэтому ничего не могу сказать об этой части.

Ahmet 12.02.2019 13:14

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

BSeitkazin 13.02.2019 11:32

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

Cyberdev 13.02.2019 11:36

У меня такая же проблема с Котлином. Я также удаляю зависимость безопасности, и это то же самое.

Peter Borbas 02.12.2019 20:15
4
8
943
1

Ответы 1

Я была такая же проблема. Моя проблема заключалась в том, что по другим причинам у меня также была зависимость org.springframework.boot:spring-boot-starter-web, поэтому тимелеаф не включал свой реактивный режим.

После того, как я удалил его, он начал работать, но принимал только Flux, и я не мог отобразить ни одного значения. Похоже, они поддерживают только итерацию (th:each) в потоке, но я не смог найти подходящей документации, только примеры приветствия.

Мой вариант использования был другим. Я просто не хотел блокировать, пока у меня не будет одного объекта данных, поэтому я придумал обходной путь, который также работает с -web. Я отложил имя представления, пока не получу данные с сервера. Таким образом, мне не нужно блокировать, прежде чем я верну имя представления, чтобы начать рендеринг. (Этот метод работает, только если вы не хотите транслировать длинный список) Для -webflux вам не нужен этот обходной путь, просто поместите свои Mono и Flux в модель. Webflux будет автоматически ждать их, прежде чем вызывать тимелеаф.

Обходной путь WebMVC:

@GetMapping("/article/{articleId}/{friendlyUrl}") fun article(@PathVariable articleId: String, @PathVariable friendlyUrl: String, model: Model): Mono<String> { return gwDispatcher.dispatch(GetArticleGwCommand(articleId)).map { it.article }.map { model.addAttribute("article", it) model.addAttribute("name", "Josh Smith"); "article" } }

Другие вопросы по теме