【问题标题】:Using spring webflow in grails 3 application在 grails 3 应用程序中使用 spring webflow
【发布时间】:2017-07-30 16:19:42
【问题描述】:

我一直在尝试将我的一些 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");
    }

问题是为什么我的布局没有被渲染?我错过了什么?

【问题讨论】:

    标签: grails spring-webflow grails3


    【解决方案1】:

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

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

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

    更新

    我做了这一切之后,遇到了一个很奇怪的问题。当我从 intellij 运行应用程序时,应用程序的 webflow 部分工作正常。但是当我使用gradlew assemble 任务创建war 时,我总是在应用程序上看到/error 页面。在日志中,它显示No mapping found for HTTP request with URI * in DispatcherServlet with name 'grailsDispatcherServlet'

    显然,我尝试创建的 bean 不存在。为了解决这个问题,我放弃了基于注释的配置,并将 resources.xml 文件放在grails-app/conf/spring/ 目录中。这解决了战争的问题。这是我的配置文件。

    <?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>
    

    【讨论】:

    • 您也可以使用 resources.groovy 文件进行该配置
    • 肯定可以在resources.groovy 中创建Bean。您将如何处理上述配置的&lt;webflow: 部分? (我刚刚再次阅读了我的问题和答案;看起来我试过了,但是在 tomcat 中部署时出现了一些问题;)
    • 好问题,我想你可以用谷歌搜索它,但这也不重要,只是在一个文件中配置 beans 更漂亮;)
    • 如果可行的话,我完全同意!任何阅读此对话并尝试过的人,请告诉我们进展如何?! :)
    猜你喜欢
    • 1970-01-01
    • 2016-01-30
    • 2011-08-28
    • 2014-10-09
    • 2019-05-10
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    相关资源
    最近更新 更多