JavaConfig Spring Web Flow返回404未找到(JSP)

时间:2017-07-21 12:08:16

标签: java spring jsp spring-webflow spring-java-config

我一直在尝试通过将现有项目从xml配置修改为JavaConfig来实现Spring Web Flow 2.4的Java配置功能。 XML版本有效,但JavaConfig没有。每次我尝试使用URL http://localhost:8080/sia_p219_ch08_spring_web_flow_order_pizza_customer_flow_complete/pizza启动流程时,它都会返回404.没有例外。控制台显示没有“找不到请求映射...”消息。该网页显示The origin server did not find a current representation for the target resource or is not willing to disclose that one exists

项目托管在github上,工作XML版本为here

我认为问题是请求网址没有调用披萨流程(/WEB-INF/flows/pizza/pizza-flow.xml)。

以下是一些代码段:

WebAppInitializer:

@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[] { RootConfig.class };
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] { WebConfig.class };
}

@Override
// map DispatcherServlet to /
protected String[] getServletMappings() {
    return new String[] { "/" };
}

RootConfig:

@Configuration
@Import({WebFlowConfig.class})
public class RootConfig {}

WebFlowConfig:

@Configuration
@ComponentScan({"pizza"})
public class WebFlowConfig extends AbstractFlowConfiguration {
    static{
        System.out.println("WebFlowConfig loaded");
    }

    @Autowired
    private WebConfig webMvcConfig;

    @Bean
    public FlowDefinitionRegistry flowRegistry() {
        return 
            getFlowDefinitionRegistryBuilder(flowBuilderServices())
            .setBasePath("/WEB-INF/flows")
            .addFlowLocationPattern("/**/*-flow.xml")
            .build();
    }

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

    @Bean
    public FlowBuilderServices flowBuilderServices() {
        return getFlowBuilderServicesBuilder()
                .setViewFactoryCreator(mvcViewFactoryCreator())
                .setDevelopmentMode(true)
                .build();
    }

    @Bean
    public MvcViewFactoryCreator mvcViewFactoryCreator() {
        MvcViewFactoryCreator factoryCreator = new MvcViewFactoryCreator();
        factoryCreator.setViewResolvers(Collections.singletonList(this.webMvcConfig.viewResolver()));
        factoryCreator.setUseSpringBeanBinding(true);
        return factoryCreator;
    }
}

WebConfig

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
    static{
        System.out.println("WebConfig loaded");
    }

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/flows/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    // configure static content handling
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {           
        configurer.enable();
    }

流定义文件和JSP很好,如果需要,您可以在github上看到它们。

非常感谢,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

到目前为止,我发现配置肯定缺少WebFlowConfig中的这部分配置(详情请参阅documentation page for integration with Spring MVC):

@Bean 
@Autowired
public FlowHandlerAdapter flowHandlerAdapter(FlowExecutor flowExecutor) {
    FlowHandlerAdapter flowHandlerAdapter = new FlowHandlerAdapter();
    flowHandlerAdapter.setFlowExecutor(flowExecutor);

    return flowHandlerAdapter;
}

@Bean 
@Autowired
public FlowHandlerMapping flowHandlerMapping(FlowDefinitionRegistry flowDefinitionRegistry) {
    FlowHandlerMapping flowHandlerMapping = new FlowHandlerMapping();
    flowHandlerMapping.setFlowRegistry(flowDefinitionRegistry);
    flowHandlerMapping.setOrder(0);

    return flowHandlerMapping;
}

同样从mvcViewFactoryCreator bean定义中删除setViewFactoryCreator定义和flowBuilderServices调用。它对我有用。