2011-12-27 22 views
6

Sto cercando di implementare la funzionalità e-mail nella mia app, ma continuo a riceverePrimavera Bean autowiring errore

No matching bean of type [org.springframework.mail.javamail.JavaMailSenderImpl] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. 

Chiunque può segnalare quello che sto facendo in modo errato?

La configurazione XML per il fagiolo è:

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

<!-- Enables the Spring MVC @Controller programming model --> 
<annotation-driven /> 
<context:annotation-config/> 
//...other stuff 

<beans:bean id="mailSession" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <beans:property name="jndiName" value="EmailServer" /> 
</beans:bean> 

<beans:bean id="emailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
    <beans:property name="session" ref="mailSession"/> 
</beans:bean> 

EmailServiceImpl classe:

@Service 
public class EmailServiceImpl implements EmailService { 

    @Autowired 
    private JavaMailSenderImpl emailSender; 

    //more code.. 
} 

project_structure

risposta

2

Grazie a tutti per le loro risposte. Non sono riuscito a ottenere l'autowiring al lavoro, ma ho avuto la soluzione di posta elettronica globale per lavorare nel modo seguente:

  1. setup il mailSession in weblogic, con un nome JNDI di "myMailSession"

aggiungi al servlet-context.xml:

<beans:bean id="mailSession" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <beans:property name="jndiName" value="myMailSession" /> 
</beans:bean> 

<beans:bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
    <beans:property name="session" ref="mailSession"/> 
</beans:bean> 

<beans:bean id="emailServiceImpl" class="com.name.here.business.EmailServiceImpl"> 
    <beans:property name="mailSender" ref="mailSender"/> 
</beans:bean> 

aggiungi al web.xml:

<resource-ref> 
    <description>the email session</description> 
    <res-ref-name>myMailSession</res-ref-name> 
    <res-type>javax.mail.Session</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 

metti in weblogic.xml:

<resource-description> 
    <res-ref-name>myMailSession</res-ref-name> 
    <jndi-name>myMailSession</jndi-name> 
</resource-description> 

EmailServiceImpl:

@Service 
public class EmailServiceImpl implements EmailService { 

    private JavaMailSender mailSender; 

    public void setMailSender(JavaMailSender mailSender) { 
     this.mailSender = mailSender; 
    } 
    //..other code 
} 
+0

Ho affrontato lo stesso problema e tutto ha funzionato quando configurato in xml. rimosse le annotazioni autowired e @service dal bean dei servizi emailServiceImpl. Autowiring funziona bene in altri fagioli. Mi chiedo cosa c'è di sbagliato con l'autowiring in JavaMail. –

1

È necessario aggiungere <context:annotation-config/> al vostro file di configurazione in modo per la primavera a autowire annotato fagioli.

http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config

+0

Ho provato e dà lo stesso errore. Lo aggiungerò di nuovo al mio post originale. Altre idee? – flynfish

+0

Ci sono altre 2 cose che potresti provare. Aggiungi un'altra linea nel tuo xml per specificare dove cercare il bean \t e prova anche a impostare l'attributo autowire-candidate su true nel bean sender dell'e-mail. – Travis

+0

Sono riuscito a riprodurre il tuo errore e la scansione dei componenti dovrebbe risolvere il tuo problema. – Travis

1

Da messaggio di errore, posso concludere che autowiring sta lavorando, ma non è in grado di trovare il fagiolo richiesto.

Assicurarsi di caricare tutti i file di definizione bean.

1

Avete un @Servizio o annotazione simile sulla vostra classe JavaMailSenderImpl stessa? Ciò farà sì che lo scanner componente di Spring inserisca un'istanza nel container spring, che potrà quindi eseguire automaticamente su EmailServiceImpl.

1

Ecco come ho riparato:

mi sono imbattuto in questo problema troppo, ho cercato di seguire i tutorial semplici online che ha funzionato perfettamente durante il test caricando manualmente il file app-context.xml ma quando ho provato a eseguire la mia app in mvc di primavera continuava a mostrare questo errore:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.springframework.mail.javamail.JavaMailSender] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:952) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:821) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:735) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478) 
    ... 42 more 

Dopo aver provato tutti i tipi di cose, mi è capitato di spostare queste due righe dal mio file di configurazione JPA/DB nella parte inferiore del mio file di configurazione di root.

Sto ancora imparando la primavera ma sto pensando che ci fosse un problema per quanto riguarda l'ordine in cui appaiono.

Edit: Questa domanda sembra di chiarire la questione con l'ordine:

Difference between applicationContext.xml and spring-servlet.xml in Spring Framework

4

ero alle prese con questo problema per una classe di servizio di posta elettronica codificato come:

@Service("emailService") 
public class EmailService { 
    @Autowired private JavaMailSenderImpl mailSender; 
    ... 
    public void send(...) { 
    // send logic 
    } 
} 

I stumbled attraverso una soluzione durante la lettura di un argomento correlato. Il punto chiave è che l'interfaccia JavaMailSender è definita nella classe applicationContext.xml come classe Spring JavaMailSenderImpl.

Fase 1: Il file contesto di applicazione è stato modificato per includere la seguente definizione di fagioli:

<bean id="mailSender" 
    class="org.springframework.mail.javamail.JavaMailSenderImpl" 
    p:host="myMailserver.mycompany.com" /> 

Fase 2: La classe di servizio di posta elettronica è stata modificata per assomigliare:

@Service("emailService") 
public class EmailService { 
    @Autowired private JavaMailSender mailSender; // Observe the change in the type 
    ... 

Voila! La primavera è felice. I sarebbe anche se mi piace sentire una spiegazione corretta dell'errore originale.

Problemi correlati