如果启用了Spring Web Security,通量不会显示在Thymeleaf中

时间:2019-02-12 08:21:22

标签: spring kotlin thymeleaf reactive

我正在尝试从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应用程序

有什么想法吗?

1 个答案:

答案 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" } }