【问题标题】:Spring MVC + Webflow 2 + Thymeleaf fragments: can't configure .HTML extensionSpring MVC + Webflow 2 + Thymeleaf 片段:无法配置 .HTML 扩展
【发布时间】:2014-07-05 01:11:17
【问题描述】:

我有一个带有 Thymeleaf 的 Spring MVC 应用程序,配置为使用片段(没有瓷砖!)并且所有文件都具有 .html 扩展名。一切正常。

现在我正在尝试设置 Webflow,但是当我调用我的 webflow url 时,我收到 404 错误,因为他尝试加载 JSP 视图而不是 html(外部流程,一切都很好):

HTTP 状态 404 - /app/WEB-INF/views/contest/contest-step1.jsp

我知道放置几公里的代码行不好,但老实说,我不知道哪些部分有趣,哪些没有。

ThymeleafConfig:

@Configuration
public class ThymeleafConfig {

    @Bean
    public TemplateResolver templateResolver() {
        ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("HTML5");

        /**
         * only on development machine
         */
        templateResolver.setCacheable(false);

        return templateResolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();

        Set<IDialect> dialects = new HashSet<IDialect>();
        dialects.add(springSecurityDialect());
        templateEngine.setAdditionalDialects(dialects);          

        templateEngine.setTemplateResolver(templateResolver());
        return templateEngine;
    }

    @Bean
    public ThymeleafViewResolver thymeleafViewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        return resolver;
    }

    @Bean
    public SpringSecurityDialect springSecurityDialect(){
        SpringSecurityDialect dialect = new SpringSecurityDialect();
        return dialect;
    }
}

WebAppConfig:

@Configuration
@EnableWebMvc
@ComponentScan("com.myapp") 
public class WebAppConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/login").setViewName("login");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    }   

    @Bean
    public UrlBasedViewResolver setupViewResolver() {
        UrlBasedViewResolver resolver = new UrlBasedViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        return resolver;
    }

    // Maps resources path to webapp/resources
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }


    /**************************************************
     * 
     * Web Flow: wizard contest
     * 
     */
    @Autowired
    private WebFlowConfig webFlowConfig;

    /**
     * Maps request paths to flows in the flowRegistry;
     * e.g. a path of /hotels/booking looks for a flow with id "hotels/booking" 
     *
     * Configuring this mapping allows the Dispatcher to map application resource paths 
     * to flows in a flow registry. 
     * For example, accessing the resource path /hotels/booking would result in a 
     * registry query for the flow with id hotels/booking. 
     * If a flow is found with that id,
     * that flow will handle the request. If no flow is found, the next handler mapping in the
     * Dispatcher's ordered chain will be queried or a "noHandlerFound" response will be returned.
     */ 
    @Bean
    public FlowHandlerMapping flowHandlerMapping() {
        FlowHandlerMapping handlerMapping = new FlowHandlerMapping();
        handlerMapping.setOrder(-1);    //0 ?
        handlerMapping.setFlowRegistry(this.webFlowConfig.flowRegistry());
        return handlerMapping;
    }

    @Bean
    public FlowHandlerAdapter flowHandlerAdapter() {
        FlowHandlerAdapter handlerAdapter = new FlowHandlerAdapter();
        handlerAdapter.setFlowExecutor(this.webFlowConfig.flowExecutor());
        handlerAdapter.setSaveOutputToFlashScopeOnRedirect(true);
        return handlerAdapter;
    }

    @Bean(name="contest/add") //defined in in WebFlowConfig
    public ContestFlowHandler ContestFlowHandler() {
        return new ContestFlowHandler();
    }

    /* TODO
    @Bean
    public AjaxThymeleafViewResolver tilesViewResolver() {
        AjaxThymeleafViewResolver viewResolver = new AjaxThymeleafViewResolver();
        viewResolver.setViewClass(FlowAjaxThymeleafTilesView.class);
        viewResolver.setTemplateEngine(templateEngine());
        return viewResolver;
    }   */





}

WebFlowConfig:

@Configuration
public class WebFlowConfig extends AbstractFlowConfiguration {
    @Autowired
    private ThymeleafConfig thymeleafConfig;
    //private WebFlowConfig WebAppConfig;

    @Bean
    public FlowDefinitionRegistry flowRegistry() {

                return getFlowDefinitionRegistryBuilder()
                        .addFlowLocation("/WEB-INF/views/gare/gare-add-flow.xml", "gare/add")
                        .build();

    }


    @Bean
    public FlowExecutor flowExecutor() {
        return getFlowExecutorBuilder(flowRegistry())               

                .setMaxFlowExecutions(5)                    

                .setMaxFlowExecutionSnapshots(30)

                .build();
    }

    @Bean
    public FlowBuilderServices flowBuilderServices() {

        return getFlowBuilderServicesBuilder()
                .setViewFactoryCreator(mvcViewFactoryCreator())
                .build();
    }

    @Bean
    public MvcViewFactoryCreator mvcViewFactoryCreator() {

        MvcViewFactoryCreator factoryCreator = new MvcViewFactoryCreator();
        factoryCreator.setViewResolvers(Arrays.<ViewResolver>asList(this.thymeleafConfig.thymeleafViewResolver()));
        factoryCreator.setUseSpringBeanBinding(true);
        return factoryCreator;
    }


}

我找到了一个快速解决方案的技巧,但老实说我不想这样做,但要正确配置解析器。诀窍是在流xml文件中设置视图文件:

<view-state id="contest-step1" model="contest" view="/WEB-INF/views/contest/contest-step1.html"></view-state>

谢谢

【问题讨论】:

    标签: spring thymeleaf spring-webflow-2


    【解决方案1】:

    在 flowRegistry 方法中尝试以下操作。

    return getFlowDefinitionRegistryBuilder(flowBuilderServices())
    

    而不是

    return getFlowDefinitionRegistryBuilder()
    

    希望这会有所帮助。

    【讨论】:

    • 我收到此错误:org.thymeleaf.exceptions.TemplateInputException:解析模板“contest-details”时出错,模板可能不存在或可能无法被任何已配置的模板解析器访问。 如果我将 "contest-details.html" 放在流 xml 中,我也会收到此错误
    • 我看到它在视图基础文件夹 (webapp/views) 中搜索“contest-details.html”,而不是在流文件夹中搜索它(xml 流定义所在的位置)跨度>
    【解决方案2】:

    我不确定,但请查看您的代码的以下部分

    @Bean
        public UrlBasedViewResolver setupViewResolver() {
            UrlBasedViewResolver resolver = new UrlBasedViewResolver();
            resolver.setPrefix("/WEB-INF/views/");
            resolver.setSuffix(".jsp");
            resolver.setViewClass(JstlView.class);
            return resolver;
        }
    

    它指向 .jsp 无论你在控制器中调用什么,它都会附加 .jsp 您的控制器代码也不在这里 url 映射应该像 /login.html 我不太熟悉 thymeleaf 和 spring-webflow-2

    【讨论】:

      猜你喜欢
      • 2018-09-24
      • 2014-01-25
      • 2016-04-22
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      相关资源
      最近更新 更多