Я пытаюсь показать поток строк из моего контроллера в представление в 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, все работает нормально, но я хотел бы защитить веб-приложение.
Любые идеи?
Привет, @Ahmet, я использую Gradle, поэтому публикую для вас отчет о зависимости: org.thymeleaf:thymeleaf:3.0.11.RELEASE (selected by rule) Спасибо.
Я подозреваю ReactiveDataDriverContextVariable(data,1). Особенно второй элемент конструктора. Попробуйте увеличить размер буфера, например ReactiveDataDriverContextVariable(data,5).
Пробовал раньше и имел тот же результат, только переменную контекста, когда она должна быть 4 строки. Может быть, я пропускаю какую-то конфигурацию?
Что касается части листьев тимьяна; там все в порядке. Это может быть проблема с конфигурацией или зависимостями. Другое дело может быть инициализация и присвоение переменной data. Я не в kotlin, поэтому ничего не могу сказать об этой части.
Я просто скопировал ваш код и запустил с помощью Java, и все работает отлично. Похоже, какая-то проблема с Котлином
Кажется, это неудачная конфигурация с безопасностью Spring, я опубликую ответ, когда выясню, как заставить его работать.
У меня такая же проблема с Котлином. Я также удаляю зависимость безопасности, и это то же самое.
Я была такая же проблема. Моя проблема заключалась в том, что по другим причинам у меня также была зависимость 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"
}
}
Ваше использование кажется правильным, но, насколько я знаю,
ReactiveDataDriverContextVariableдоступен в Thymeleaf 3.0. Пожалуйста, опубликуйте файл pom.