我正在尝试从Controller到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配置和依赖项时,一切正常,但我想保护Web应用程序
有什么想法吗?
答案 0 :(得分:1)
我有同样的问题。我的问题是,由于其他原因,我也将org.springframework.boot:spring-boot-starter-web作为依赖项,因此百里香叶未启用其反应模式。
删除它后,它开始工作,但是它只接受Flux,而我无法呈现单个值。看起来他们仅支持流上的迭代(th:each),但我找不到仅世界示例的适当文档。
我的用例不同。我只是不想阻塞,直到有了我的singe数据对象,所以我想出了一种也可以与-web一起使用的解决方法。我推迟了视图名称,直到我从服务器收到数据为止。这样,在返回视图名称以开始渲染之前,无需阻塞。 (仅当您不想串流较长的列表时,此方法才有效) 对于-webflux,您不需要此解决方法,只需将Monos和Fluxes放入模型中即可。 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"
}
}