2016-08-11 1 views
1

Je n'ai pas trouvé de solution à mon problème. J'essaie de faire fonctionner la validation sous forme de flux web de printemps. J'ai besoin de définir validateur dans la configuration, mais il est situé dans un autre fichier de configuration et il semble que le printemps ne peut pas trouver le bon haricot. Comment puis-je réussir l'injection ici? Autant que je sache, Autowiring devrait injecter le bean dans la référence du validateur. Peut-être que cela a quelque chose à voir avec l'ordre de chargement des classes de configuration?Spring - problème avec l'injection de haricot de validation

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

L'erreur que je reçois:

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)} 

Im en utilisant ressort 4.3.2.RELEASE

Cependant, lorsque Supprimer la dépendance de Validator FlowAdapter.class J'obtiens l'erreur:

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 

code de classe pleine FlowConfiguration, peut-être que je fais quelque chose de mal?

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

Si je supprime .setFlowBuilderServices méthode (flowBuilderServices()), tout fonctionne très bien

EDIT: J'ai réussi à obtenir ce travail en supprimant @Configuration annotation classe de configuration de flux de forme, maintenant il ressemble à ceci:

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

Et maintenant je peux utiliser injecté LocalValidatorBean dans cette classe.

+0

Pouvez-vous essayer la signature de changement 'LocalValidatorFactoryBean publique validateur() '' 'validateur public validateur()'. Aide-t-il? – vsminkov

+0

même résultat :-( Causé par: org.springframework.beans.factory.NoSuchBeanDefinitionException: Aucun bean qualifié de type [org.springframework.validation.Validator] trouvé pour la dépendance [org.springframework.validation.Validator]: –

+0

Apparaît problème quelque part plus profond Je ne peux pas reproduire votre problème localement :(Je vais supprimer ma réponse parce que le code que j'ai ave comme une réponse est un équivalent à votre code – vsminkov

Répondre

0

J'interprète que vous avez éventuellement besoin d'un FlowBuilderServices qui a une référence au bean Validator.

Ceci peut être réalisé en utilisant la balise Autowired dans FlowBuilderServices

public class FlowBuilderServices{ 
@Autowired 
Validator validator 

... 
} 

Et puis en FlowConfiguration il vous suffit de définir la fève

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

Je l'ai compris, je utilisait à la fois l'annotation d'importation et l'annotation de configuration, donc Spring a scanné les composants et trouvé la classe FlowConfiguration, a essayé d'autowire le champ et n'a pas trouvé l'objet correspondant Une fois que j'ai supprimé l'annotation de configuration tout fonctionne bien, merci! –