JavaConfig Spring Web Flow 返回 404 not found (JSP)

标签 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。没有异常(exception)。控制台未显示“未找到请求映射...”消息。该网页显示源服务器未找到目标资源的当前表示形式或不愿透露存在的表示形式

项目托管于 github , 工作的 XML 版本是 here .

我认为问题是请求 URL 没有调用披萨流 (/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[] { "/" };
}

根配置:

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

网络流量配置:

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

网络配置

@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 上看到它们如果你想。

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

最佳答案

到目前为止,我发现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;
}

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

关于JavaConfig Spring Web Flow 返回 404 not found (JSP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45237294/

相关文章:

java - 非法状态异常 : Cannot convert value of type LdapTemplate to LdapTemplate

java - 将参数从 android 传递到 servlet/jsp

Java EE - servlet 未转发到 jsp 文件

java - 在android中保存对象

java - spring-boot 应用程序启动失败

java - 是否可以使用通过蓝图注入(inject)的 OSGi Enterprise 4.x 和 JPA 2.1 实体监听器?

java - 如何获取principal.userAuthentication.details?

java.lang.NoClassDefFoundError : org/springframework/web/method/annotation/ExceptionMethodMapping

java - 在 Android 中将 Parceables 数组写入 Parcel

java - 使用 Java 8 安装 Dynamic Code Evolution VM (DCE) 时出错