2013-05-20 31 views
5

Ho il codice @Inject funziona in una classe ma non in un'altra. Ecco il mio codice:L'annotazione di primavera @Inject non funziona

  • context.xml
<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 

     xsi:schemaLocation=" http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd 
        "> 
    <bean id="multipartResolver" 
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean> 
    <context:component-scan base-package="com.myfashions.services"/> 
    <context:component-scan base-package="com.myfashions.dao"/> 
</beans> 
  • SellerRetriever.java
public class SellerRetriever { 
    @Inject 
    UserDAO userDAO; 
    ... 
    ... 
} 

UserDAO classe è presente in com.myfashions.dao pacchetto. @Inject non funziona in Seller.java. Qualche ragione per cui?

+1

La classe 'Seller' Spring è gestita? O lo stai creando con l'operatore 'new'? –

+1

Grazie @ nicholas.hauschild mi hai fatto sapere il mio errore. Ho creato quell'oggetto con un nuovo operatore. Questa è stata la ragione per cui ho ricevuto tutte le iniezioni null – vicky

+0

'@ Inject' non è un'annotazione di primavera – ACV

risposta

2

ho trovato il mio errore, sto postando questo perché nel caso in cui qualcuno ha lo stesso problema. Ho usato un nuovo operatore per creare un oggetto SellerRetriver. Inject non funzionerà se viene utilizzato un nuovo operatore per chiamare quella particolare classe.

3

Per essere ammessi per la scansione, la classe deve essere annotato sia con un più generico @Component, o @Service o @Repositories ecc .. Nel tuo caso, @Service adatta logicamente migliori. Si potrebbe quindi (se necessario) definire alcuni aspetti (AOP) incentrati specificamente sulla chiamata di servizi.

Inoltre, è possibile utilizzare @Autowired anziché @Inject per recuperare il bean.

Per ulteriori informazioni sulle differenze riguardanti queste due annotazioni:

What is the difference between @Inject and @Autowired in Spring Framework? Which one to use under what condition?

e si può vedere il mio commento proprio sotto spiegare un buon motivo per tenere @Autowired invece di @Inject.

+0

È un'ottima risposta, ma sto ancora ricevendo NullPointerException. – vicky

+0

Ho pensato che potevi usare '@ Inject' o' @ Autowired' in congiunzione con 'component-scan' ... a patto che tu stia usando Spring 3. – Jonathan

+0

aggiungi @Component o @ Service o @ Repositories sopra la tua classe dichiarazione, altrimenti non verrebbe scansionata. – Mik378

7

Assicurarsi che sia SellerRetriever sia l'implementazione di UserDAO siano annotati per la scansione del componente. Ciò farà sì che quest'ultimo viene iniettato nella ex:

@Service 
public class SellerRetriever { 
    @Inject 
    UserDAO userDAO; 
    ... 
} 

annotare il UserDAO attuazione con @Component.

Durante la scansione di più percorsi usare:

<context:component-scan base-package="com.myfashions.services, com.myfashions.dao"/> 
+1

UserDAO viene iniettato in altre classi di servizio ma non in SellerRetriever.java – vicky

+1

Suppongo che 'SellerRetriever' in' com.myfashions.services'. Prova a utilizzare un tag di scansione a componente singolo nel contesto dell'applicazione – Reimeus

+0

@Reimeus Questo è un suggerimento interessante. Potrebbe Spring fare il primo componente di scansione e perdere 'UserDAO' perché non si avvicina ad esso fino alla scansione del secondo componente? – davidfmatheson

Problemi correlati