2016-08-11 28 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類,嘗試自動裝入字段並找不到匹配的對象。一旦我刪除配置註釋,一切正常,謝謝!:) –