2010-12-31 17 views
6

Nuovi aggiornamenti: Dec 31 2010 8:15 PM
Correzione molto sporca, ma questo è il modo in cui ho temporaneamente fatto funzionare il messaggio Source. Ho cambiato la mia classe Controller per passare 'messageSource' alla classe Message e sono in grado di recuperare i messaggi. Si prega di rivedere la definizione della classe qui sotto e fammi sapere ulteriori informazioni che potrebbe essere necessario per aiutare. Apprezzo molto tutto l'aiuto che stai fornendo.Spring @Autowired messageSource funziona in Controller ma non in altre classi?

Dec 31 2010 3 PM
Poiché non sono riuscito a configurare messageSource tramite le annotazioni, ho tentato di configurare l'iniezione messageSource tramite servlet-context.xml. Ho ancora messageSource come null. Per favore fatemi sapere se avete bisogno di ulteriori informazioni specifiche, e vi fornirò. Grazie per il vostro aiuto in anticipo.

servlet-context.xml 
<beans:bean id="message" 
    class="com.mycompany.myapp.domain.common.message.Message"> 
    <beans:property name="messageSource" ref="messageSource" /> 
</beans:bean> 

Spring fornisce il seguente messaggio di informazioni sull'inizializzazione della molla.

INFO : org.springframework.context.annotation.ClassPathBeanDefinitionScanner - JSR-330 'javax.inject.Named' annotation found and supported for component scanning 

INFO : org.springframework.beans.factory.support.DefaultListableBeanFactory - Overriding bean definition for bean 'message': replacing [Generic bean: class [com.mycompany.myapp.domain.common.message.Message]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [C:\springsource\tc-server-developer-2.1.0.RELEASE\spring-insight-instance\wtpwebapps\myapp\WEB-INF\classes\com\mycompany\myapp\domain\common\message\Message.class]] with [Generic bean: class [com.mycompany.myapp.domain.common.message.Message]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in ServletContext resource [/WEB-INF/spring/appServlet/servlet-context.xml]] 

INFO : org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring 

INFO : org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.s[email protected]1c7caac5: defining beans [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0,org.springframework.format.support.FormattingConversionServiceFactoryBean#0,org.springframework.validation.beanvalidation.LocalValidatorFactoryBean#0,org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter#0,org.springframework.web.servlet.handler.MappedInterceptor#0,org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0,org.springframework.web.servlet.handler.SimpleUrlHandlerMapping#0,xxxDao,message,xxxService,jsonDateSerializer,xxxController,homeController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,tilesViewResolver,tilesConfigurer,messageSource,org.springframework.web.servlet.handler.MappedInterceptor#1,localeResolver,org.springframework.web.servlet.view.ContentNegotiatingViewResolver#0,validator,resourceBundleLocator,messageInterpolator]; parent: org.s[email protected]4f47af3 


devo la definizione di seguito per sorgente del messaggio in 3 classi. In modalità di debug, posso vedere che nella classe xxxController, messageSource viene inizializzato su org.springframework.context.support.ReloadableResourceBundleMessageSource. Ho annotato la classe Message con @Component e xxxHibernateDaoplpl con @Repository. Ho anche incluso la definizione del namespace di contesto in servlet-context.xml. Ma nella classe Message e nella classe xxxHibernateDaoImpl, lo messageSource è ancora nullo.

Perché il messaggio Spring non viene inizializzato? Nelle altre due classi, sebbene nelle classi xxxController, viene inizializzato correttamente?

@Controller 
public class xxxController{ 
    @Autowired 
    private ReloadableResourceBundleMessageSource messageSource; 
} 

@Component 
public class Message{ 
@Autowired 
private ReloadableResourceBundleMessageSource messageSource; 
} 

@Repository("xxxDao") 
public class xxxHibernateDaoImpl{ 
@Autowired 
private ReloadableResourceBundleMessageSource messageSource; 
} 

<beans:beans 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

<beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
      <beans:property name="basename" value="/resources/messages/messages" /> 
</beans:bean> 

    <context:component-scan base-package="com.mycompany.myapp"/> 
</beans> 
+0

Come hai dichiarato quelle classi a Spring? – skaffman

+0

Sì. Ho dichiarato quelle lezioni a primavera. Si prega di vedere la definizione aggiornata sopra. – Jayaprakash

risposta

4

Spring non conosce le classi da cui si ottiene un campo di valori nulli. Si può dire primavera su di loro definendoli come fagioli nel vostro contesto app o annotare le classi @Component

Il motivo per cui la prima classe è sempre autowired correttamente è dovuto al fatto che la classe sia correttamente annotato come @Controller

+0

Consultare le classi aggiornate con @ Repository/@ Annotazioni dei componenti e servlet-context.xml. Il messaggio Source è ancora nullo. Sospettavo che potesse essere l'ordine di definizione in servlet-context.xml. Quindi, ho inserito il tag di scansione dei componenti dopo la definizione di messageSource. Ancora il problema non è stato risolto. Vedo che il xxx e il xxxController vengono prima di istanziare il messaggio di debug prima di messageSource (incollato sotto). Non sono sicuro che sia comunque correlato. – Jayaprakash

+0

INFO: org.springframework.beans.factory.support.DefaultListableBeanFactory - Singlet pre-istanziazione in org.s[email protected]5883914b: definizione dei bean [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping # 0, ..., xxxDao, messaggio, xxxService, jsonDateSerializer, xxxController, HomeController, org.springframework.context.annotation.internalConfigurationAnnotationProcessor, ... 0, validatore, resourceBundleLocator, messageInterpolator]; parent: org.s[email protected]3f5ebf57 – Jayaprakash

+0

INFO: org.springframework.beans.factory.support.DefaultListableBeanFactory - Singlet pre-istanziazione in org.s[email protected]5883914b: definizione bean [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping # 0, ..., xxxDao, messaggio, xxxService, jsonDateSerializer, xxxController, homeController, ..., tilesConfigurer, messageSource, org.springframework.web.servlet. handler.MappedInterceptor # 1, ..., validator, resourceBundleLocator, messageInterpolator]; parent: org.s[email protected]3f5 – Jayaprakash

2

Prova a perfeziona il tuo pacchetto base. Non lasciare che scansioni a molla tutta la tua classe di applicazione com.mycompany.myapp, (avrai un tempo di avvio migliore).

Supponiamo di avere la classe del controller in un pacchetto: com.mycompany.myapp.controller e la vostra classe di servizio (annotato con @component, @repository) nel pacchetto com.mycompany.myapp.services

Aggiungere questo al tuo [servlet-name] -servlet.xml (file di contesto Dispatcher)

<context:component-scan base-package="com.mycompany.myapp.controller" /> 

In altra parte, aprire il servlet-context.xml (dovrebbe essere un contesto applicativo caricato da ContextLoaderListener) e aggiungere questo:

<context:component-scan base-package="com.mycompany.myapp.services" /> 

seguito dalla dichiarazione del tuo messaggio Origine come hai fatto.

Si avrà un messaggio Origine iniettata in ogni punto dell'autorizzazione.Dovrebbe funzionare perché roba definita in Dispatcher-context-file può vedere altri bean dichiarati nei file contesto dell'applicazione ma non l'opposto

+0

Grazie per aver risposto a questa discussione. Ho definito component-scan prima seguito da messageSource definition in servlet-context.xml. Pensi che dovrei invertire l'ordine per garantire che Spring abbia l'origine dei messaggi durante la scansione dei componenti? Significa che la scansione dei componenti dovrebbe essere eseguita alla fine, quando tutti gli altri bean sono stati definiti in servlet-context.xml? Grazie per il vostro aiuto in anticipo – Jayaprakash

+0

Ho provato a spostare componente-scan alla fine dopo la definizione messageSource in servlet-context.xml. Ma non ha ancora risolto il problema :( – Jayaprakash

+0

Cerca di essere più specifico su ciò che dai alla scansione dei componenti. Ho aggiornato la mia risposta. – redochka

Problemi correlati