我一直在通过将现有项目从 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/