grails - 在Grails 3应用程序中使用Spring Webflow

标签 grails spring-webflow grails3

我一直在尝试将我的grails 2代码中的某些移植到grails 3中。该特定代码使用grails-webflow插件(仅在grails 2.x之前受支持;由于在grails核心中进行了一些大修,它现在被破坏了)。

因此,我决定直接在我的应用程序中使用spring webflow。我已经能够进行基本的水暖工作了。那是我已经设置
* Webflow的应用程序上下文
*创建流工厂和所有
*编写流程xml。
*创建其他必要的bean。

现在,当我点击映射到流的URL时,可以看到我的.gsp页面正在呈现。但是问题是,它没有解决布局。页面即将没有任何样式/布局。我想念什么?

这是我的gsp page

<html>
<head>
<title><g:brandedTitle/> - Repository Database: Administrator</title>
<meta content="main" name="layout"/>
<script type="text/javascript" src="${assetPath(src: 'da.js')}"></script>
.... 
....

这就是我完成webflow管道的方式。
@Configuration
@ComponentScan
class InstallRepositoryWebflow extends AbstractFlowConfiguration {

    @Autowired
    GroovyPagesTemplateEngine groovyPagesTemplateEngine;
    @Autowired
    GroovyPageLocator groovyPageLocator;
    @Autowired
    GrailsLayoutViewResolver grailsLayoutViewResolver;

    @Bean
    public FlowDefinitionRegistry flowRegistry() {
        return getFlowDefinitionRegistryBuilder(flowBuilderServices())
        // type on browser localhost:<port>/<context-path>/hitMeToInvokeThisFlow to invoke this flow.
                .addFlowLocation("/WEB-INF/flows/install-repository.xml", "installrep/install")
                .build();
    }

    @Bean
    public FlowExecutor flowExecutor() {
        return getFlowExecutorBuilder(flowRegistry()).build();
    }

    @Bean
    public FlowBuilderServices flowBuilderServices() {
        return getFlowBuilderServicesBuilder()
                .setViewFactoryCreator(viewFactoryCreator())
                .build();
    }

    @Bean
    public ViewFactoryCreator viewFactoryCreator() {
        List<ViewResolver> resolvers = new ArrayList<>(1);
        resolvers.add(gspViewResolver());
        resolvers.add(grailsLayoutViewResolver);
        ViewFactoryCreator creator = new MvcViewFactoryCreator();
        creator.setViewResolvers(resolvers);
        return creator;
    }

    @Bean
    ViewResolver gspViewResolver() {
        GroovyPageViewResolver innerGspViewResolver = new GroovyPageViewResolver(groovyPagesTemplateEngine, groovyPageLocator);
        //innerGspViewResolver.setAllowGrailsViewCaching(!gspReloadingEnabled || viewCacheTimeout != 0);
        //innerGspViewResolver.setCacheTimeout(gspReloadingEnabled ? viewCacheTimeout : -1);
        return innerGspViewResolver;
    }
}

这是resource.groovy的相关部分
 flowHandlerAdapter(FlowHandlerAdapter) {
        flowExecutor = ref("flowExecutor");
    }

    flowHandlerMapping(FlowHandlerMapping) {
        flowRegistry = ref("flowRegistry");
    }

问题是为什么未渲染我的布局?我想念什么?

最佳答案

最后,我找到了这个问题的答案。如果我使用SitemeshLayoutViewResolver layoutViewResolver,而不是创建自定义解析器GroovyPageViewResolver innerGspViewResolver = new GroovyPageViewResolver(groovyPagesTemplateEngine, groovyPageLocator);,那么我的问题就解决了。因此,基本上必须是这样。

@Bean
ViewResolver gspViewResolver() {
    return jspViewResolver;
}
@Autowired
GrailsViewResolver jspViewResolver

这是示例项目here,以防有人在寻找工作示例。

更新资料

完成所有这些操作后,我遇到了一个非常奇怪的问题。当我从intellij运行应用程序时,应用程序的webflow部分可以正常工作。但是,当我使用war任务创建gradlew assemble时,我总是在应用程序上出现/ error页面。在日志中,它说No mapping found for HTTP request with URI * in DispatcherServlet with name 'grailsDispatcherServlet'

显然,我要创建的bean不存在。为了解决此问题,我不再使用基于注释的配置,而是将resources.xml文件放在grails-app/conf/spring/目录中。那解决了 war 问题。这是我的配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<!--suppress SpringFacetInspection -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:webflow="http://www.springframework.org/schema/webflow-config"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/webflow-config
           http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.4.xsd">

    <webflow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices">
        <webflow:flow-location path="/WEB-INF/flows/install-repository.xml" id="installrep/install"/>
    </webflow:flow-registry>

    <webflow:flow-executor id="flowExecutor" />

    <webflow:flow-builder-services id="flowBuilderServices" view-factory-creator="mvcViewFactoryCreator"/>

    <bean id="mvcViewFactoryCreator" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
        <property name="viewResolvers" ref="resolvers"/>
    </bean>

    <bean id="resolvers" class="java.util.ArrayList">
        <constructor-arg>
            <list>
                <ref bean="jspViewResolver" />
            </list>
        </constructor-arg>
    </bean>

    <bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
        <property name="flowExecutor" ref="flowExecutor" />
    </bean>

    <bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
        <property name="flowRegistry" ref="flowRegistry"/>
        <property name="order" value="0"/>
    </bean>

</beans>

关于grails - 在Grails 3应用程序中使用Spring Webflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42699446/

相关文章:

java - Spring MVC 与 Spring Webflow

grails - 为什么 Jetty 寻找 JSP 而不是 GSP?

grails - 使用Grails在 Elasticsearch 中安装head插件

grails - 在另一个 session 中使用 session 变量grails 2.4.2

Grails Webflow - 将事物保持在流程范围之外

grails - 如何在本地完全运行Grails?

Grails 3 和 IntelliJ 无法启动项目

grails - 如何使用拦截器在不使用带有 grails 3 的 Spring Security 的情况下创建登录功能

grails - Hibernate的hasMany/belongsTo结构

grails - 想要删除和插入同一操作