2011-12-27 12 views
6

Próbuję zaimplementować funkcjonalność e-mail w mojej aplikacji, ale wciąż otrzymujęWiosna Bean autowiring błąd

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. 

Czy ktoś może wskazać co robię nieprawidłowo?

config XML dla fasoli jest:

<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 klasa:

@Service 
public class EmailServiceImpl implements EmailService { 

    @Autowired 
    private JavaMailSenderImpl emailSender; 

    //more code.. 
} 

project_structure

Odpowiedz

2

Dziękuję wszystkim za odpowiedzi. I był w stanie uzyskać autowiring do pracy, ale mam całościowe rozwiązanie e-mail do pracy, wykonując następujące czynności:

  1. setup się mailSession w WebLogic, z JNDI nazwą „myMailSession”

dodaj do serwletu-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> 

dodać do 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> 

dodatek do 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

Zmierzyłem się z tym samym problemem i wszystko działało po skonfigurowaniu w xml. usunięto adnotacje autowired i @service z komponentu bean usługi emailServiceImpl. Autowiring działa dobrze w innych ziarnach. Zastanawiam się, co jest nie tak z autowiring w JavaMail. –

1

Trzeba dodać <context:annotation-config/> do pliku konfiguracyjnego, aby na wiosnę do autowire odnotowany fasolki.

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

+0

Próbowałem tego i daje ten sam błąd. Dodam go z powrotem do mojego oryginalnego wpisu. Jakieś inne pomysły? – flynfish

+0

Są dwie inne rzeczy, które możesz wypróbować. Dodaj kolejną linię do pliku xml, aby określić miejsce skanowania dla komponentu bean, a następnie spróbuj ustawić atrybut kandydata na autowira na wartość true w komponencie bean nadawcy wiadomości e-mail. – Travis

+0

Udało mi się odtworzyć Twój błąd, a skanowanie podzespołów powinno rozwiązać problem. – Travis

1

z komunikatu o błędzie, mogę stwierdzić, że autowiring działa, ale nie jest w stanie znaleźć odpowiednią Bean.

Upewnij się, że załadowałeś wszystkie pliki definicji fasoli.

1

Czy masz @Service lub podobną adnotację w swojej klasie JavaMailSenderImpl? Spowoduje to, że skaner komponentu Spring umieści jego instancję w pojemniku sprężynowym, który następnie może zostać automatycznie zaindeksowany na EmailServiceImpl.

1

To jak naprawiłem go:

wpadłem na ten problem też starałem się śledzić prostych tutoriali w Internecie, który działał idealnie podczas testowania, ręcznie ładując plik app-context.xml, ale gdy próbowałem uruchomić moją aplikację mvc na wiosnę, nadal wyświetlał się ten błąd:

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 

Po wypróbowaniu wszystkich rzeczy, zdarzyło mi się przenieść te dwie linie z mojego pliku konfiguracyjnego JPA/DB na spód mojego pliku konfiguracji root.

<context:annotation-config/>   
<context:component-scan base-package="my.app.service.layer"/> 

Nadal uczę się Spring, ale myślę, że był problem dotyczący kolejności, w jakiej się pojawiają.

Edit: To pytanie wydaje się wyjaśnienie problemu z rzędu:

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

4

męczyłem się z tym samym problemem dla klas usług email kodowane jak:

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

I stumbled w całym rozwiązaniu, czytając o pokrewnym temacie. Kluczową kwestią jest to, że interfejs JavaMailSender jest zdefiniowany w applicationContext.xml jako klasa Spring JavaMailSenderImpl.

Krok 1: Plik kontekstu aplikacji został zmodyfikowany, aby zawierać następującą definicję Fasola:

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

Krok 2: Klasa usługa e-mail został zmodyfikowany, aby wyglądać tak:

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

Voila! Wiosna jest szczęśliwa. I would chociaż chciałbym usłyszeć prawidłowe wyjaśnienie pierwotnego błędu.

Powiązane problemy