Использование весеннего потока в приложении Grails 3

Я пытался портировать некоторые из моих кодов Grails 2 на Grails 3. Этот конкретный код использует плагин Grails-Webflow (который поддерживался только до Grails 2.x; сейчас он не работает, потому что некоторые изменения в ядре Grails).

Поэтому я решил напрямую использовать Spring Webflow внутри моего приложения. Я был в состоянии сделать основную сантехнику. То есть я установил * контекст приложения для веб-потока * создал фабрики потока и все * написал поток XML. * создал другие необходимые бобы.

Теперь, когда я нажимаю 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>
.... 
....

Вот как я сделал сантехнику для веб-потока.

@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");
    }

ВОПРОС: Почему мой макет не отображается? Чего мне не хватает?

2 ответа

Решение

Наконец-то я нашел ответ на этот вопрос. Если я использую SitemeshLayoutViewResolver layoutViewResolver вместо создания собственного распознавателя GroovyPageViewResolver innerGspViewResolver = new GroovyPageViewResolver(groovyPagesTemplateEngine, groovyPageLocator); тогда моя проблема решена. Так что в основном это должно быть так.

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

Это пример проекта на тот случай, если кто-то ищет рабочий пример.

Обновить

Как только я сделал все это, я столкнулся с очень странной проблемой. Часть веб-потока приложения работает нормально, когда я запускаю приложение из intellij. Но когда я создал war с помощью gradlew assemble задача, я всегда получаю / страницу с ошибкой в ​​приложении. В логах написано No mapping found for HTTP request with URI * in DispatcherServlet with name 'grailsDispatcherServlet',

Видимо, бобов, которые я пытаюсь создать, там нет. Чтобы решить эту проблему, я отошел от конфигурации, основанной на аннотациях, и поместил файл 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 вместо applicationContext.xml, вы можете сделать следующее:

      xmlns([webflow:"http://www.springframework.org/schema/webflow-config"])

webflow.flow-registry(
        id:"flowRegistry",
        flow-builder-services:"flowBuilderServices"
){
    webflow.flow-location(
            path:"/WEB-INF/flows/install-repository.xml",
            id:"installrep/install"
    )
}//eo flow-registry

webflow.flow-executor(id:"flowExecutor")

webflow.flow-builder-services(
        id:"flowBuilderServices",
        view-factory-creator:"mvcViewFactoryCreator")

mvcViewFactoryCreator(org.springframework.webflow.mvc.builder.MvcViewFactoryCreator){
    viewResolvers =  ref("resolvers")
}

resolvers(ArrayList, [ ref("jspViewResolver") ])

myFlowHandlerAdapter(org.springframework.webflow.mvc.servlet.FlowHandlerAdapter){
    flowExecutor = ref("flowExecutor")
}

myFlowHandlerMapping(org.springframework.webflow.mvc.servlet.FlowHandlerMapping){
    flowRegistry = ref("flowRegistry")
    order = 0
}
Другие вопросы по тегам