2016-08-11 75 views
1

我无法在任何地方找到解决方案。 我试图在春季Web流程表单中进行验证。我需要 在配置中设置验证器,但它位于另一个配置文件 ,似乎spring找不到合适的bean。我如何在这里实现成功注射? 据我所知,Autowiring应该将bean注入验证器引用。 也许它与加载配置类的顺序有关?春天 - 注入验证程序bean时出现问题

WebConfig.java:

@Configuration 
@Import(godziszewski.patryk.ElectronicsStore.config.FlowConfiguration.class) 
@EnableWebMvc 
@ComponentScan(basePackages = "godziszewski.patryk") 
public class WebConfig extends WebMvcConfigurerAdapter { 
    .... 
    @Bean 
    public LocalValidatorFactoryBean validator() 
    { 
     LocalValidatorFactoryBean lv = new LocalValidatorFactoryBean(); 
     lv.setValidationMessageSource(messageSource()); 
     return lv; 
    } 
} 

FlowConfiguration.java:

@Configuration 
public class FlowConfiguration extends AbstractFlowConfiguration { 
    @Autowired 
    Validator validator; 
    .... 

    @Bean 
    public FlowBuilderServices flowBuilderServices() 
    { 
     FlowBuilderServices fbs = new FlowBuilderServices(); 
     fbs.setValidator(validator); 
     return fbs; 
    } 
} 

,我发现了错误:

org.springframework.beans.factory.UnsatisfiedDependencyException: 
    Error creating bean with name 'flowConfiguration': 
    Unsatisfied dependency expressed through field 'validator': 
    No qualifying bean of type [org.springframework.validation.Validator] found for dependency [org.springframework.validation.Validator]: 
    expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; 
    nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
    No qualifying bean of type [org.springframework.validation.Validator] found for dependency [org.springframework.validation.Validator]: 
    expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

进出口使用弹簧4.3.2.RELEASE

但是,当我从FlowAdapter.class删除验证依赖我得到错误:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flowBuilderServices' defined in class path resource [godziszewski/patryk/ElectronicsStore/config/FlowConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: The ViewFactoryCreator is required 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:381) 
    at godziszewski.patryk.ElectronicsStore.config.FlowConfiguration$$EnhancerBySpringCGLIB$$b65e14d6.flowBuilderServices(<generated>) 
    at godziszewski.patryk.ElectronicsStore.config.FlowConfiguration.flowRegistry(FlowConfiguration.java:25) 
    at godziszewski.patryk.ElectronicsStore.config.FlowConfiguration$$EnhancerBySpringCGLIB$$b65e14d6.CGLIB$flowRegistry$3(<generated>) 
    at godziszewski.patryk.ElectronicsStore.config.FlowConfiguration$$EnhancerBySpringCGLIB$$b65e14d6$$FastClassBySpringCGLIB$$e5741e7e.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) 
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:356) 
    at godziszewski.patryk.ElectronicsStore.config.FlowConfiguration$$EnhancerBySpringCGLIB$$b65e14d6.flowRegistry(<generated>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) 
    ... 24 more 
Caused by: java.lang.IllegalArgumentException: The ViewFactoryCreator is required 

完全FlowConfiguration类代码,也许我做错了什么?

package godziszewski.patryk.ElectronicsStore.config; 



import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.validation.Validator; 
import org.springframework.webflow.config.AbstractFlowConfiguration; 
import org.springframework.webflow.definition.registry.FlowDefinitionRegistry; 
import org.springframework.webflow.engine.builder.support.FlowBuilderServices; 
import org.springframework.webflow.executor.FlowExecutor; 
import org.springframework.webflow.mvc.servlet.FlowHandlerAdapter; 
import org.springframework.webflow.mvc.servlet.FlowHandlerMapping; 


@Configuration 
public class FlowConfiguration extends AbstractFlowConfiguration { 


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

    @Bean 
    public FlowHandlerMapping flowHandlerMapping() 
    { 
     System.out.println("flowconfig"); 
     FlowHandlerMapping fh = new FlowHandlerMapping(); 
     fh.setFlowRegistry(flowRegistry()); 
     return fh; 
    } 
    @Bean 
    public FlowHandlerAdapter flowHandlerAdapter() 
    { 
     FlowHandlerAdapter fh = new FlowHandlerAdapter(); 
     fh.setFlowExecutor(flowExecutor()); 
     return fh; 
    } 
    @Bean 
    public FlowBuilderServices flowBuilderServices() 
    { 
     FlowBuilderServices fbs = new FlowBuilderServices(); 
     //fbs.setValidator(validator); 
     return fbs; 
    } 
} 

如果我删除.setFlowBuilderServices(flowBuilderServices())方法,一切工作正常

编辑:我设法删除@Configuration注释的形式流动配置类得到这个工作,现在看起来是这样的:

//@Configuration 
public class FlowConfiguration extends AbstractFlowConfiguration { 

    @Autowired 
    Validator validator; 

    ... 
    @Bean 
    public FlowBuilderServices flowBuilderServices() 
    { 
     System.out.println(validator.toString()); 
     FlowBuilderServices fbs = new FlowBuilderServices(); 
     fbs.setValidator(validator); 
     return fbs; 
    } 

现在我可以在这个类中使用注入LocalValidatorBean。

+0

你可以尝试改变签名'公共LocalValidatorFactoryBean验证()来实现'到'public Validator validator()'。它有帮助吗? – vsminkov

+0

相同的结果:-( 引起者:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到符合[org.springframework.validation.Validator]类型[org.springframework.validation.Validator]的合格bean: –

+0

似乎问题我不能在本地重现你的问题:(我会删除我的答案,因为代码我有一个答案是相当于你的代码 – vsminkov

回答

0

我解释说你最终需要一个FlowBuilderServices,它具有对Validator bean的引用。

这可以通过使用自动装配Autowired标记内FlowBuilderServices

public class FlowBuilderServices{ 
@Autowired 
Validator validator 

... 
} 

然后在FlowConfiguration你只需要定义bean

@Bean 
public class FlowBuilderServices flowBuilderServices() 
    { 
     FlowBuilderServices fbs = new FlowBuilderServices(); 
     return fbs; 
    } 
+0

我想通了,我同时使用导入注释和配置注释,所以Spring扫描组件并找到FlowConfiguration类,尝试自动装入字段并找不到匹配的对象。一旦我删除配置注释,一切正常,谢谢!:) –