Ошибка автоматического подключения Spring Bean - PullRequest
6 голосов
/ 27 декабря 2011

Я пытаюсь реализовать функцию электронной почты в своем приложении, но продолжаю получать

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.

Кто-нибудь может указать, что я делаю неправильно?

XML-конфигурация для bean-компонента:

<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 класс:

@Service
public class EmailServiceImpl implements EmailService {

    @Autowired
    private JavaMailSenderImpl emailSender; 

    //more code..
}

project_structure

Ответы [ 6 ]

4 голосов
/ 27 августа 2012

Я боролся с этой самой проблемой для класса обслуживания электронной почты, закодированного как:

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

I наткнулся на решение, читая о связанной теме.Ключевым моментом является то, что интерфейс JavaMailSender определен в applicationContext.xml как класс Spring JavaMailSenderImpl.

Шаг 1. Файл контекста приложения был изменен, чтобы включить следующее определение компонента:

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

Шаг 2. Класс обслуживания электронной почты был изменен так:

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

Вуаля!Весна счастлива.Я хотел бы , хотя хотел бы услышать правильное объяснение первоначальной ошибки.

2 голосов
/ 29 декабря 2011

Спасибо всем за ответы.Мне не удалось заставить работать автоматическую разводку, но я получил общее решение для работы с электронной почтой, выполнив следующее:

  1. setup mailSession в weblogic с именем jndi:"myMailSession"

добавить в 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>

добавить в 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> 

добавить в 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
}
1 голос
/ 11 июля 2012

Вот как я это исправил:

Я тоже столкнулся с этой проблемой, я пытался следовать простым онлайн-учебникам, которые отлично работали во время тестирования, загружая файл app-context.xml вручную, но когда я пытался запустить мое приложение Spring mvc, он продолжал показывать эту ошибку:

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

Попробовав все виды вещей, я переместил эти две строки из файла конфигурации JPA / DB в конец файла root-config.

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

Я все еще изучаю Spring, но думаю, что возникла проблема с порядком их появления.

Изменить: Этот вопрос, кажется, проясняет проблему с заказом:

Разница между applicationContext.xml и spring-servlet.xml в Spring Framework

1 голос
/ 27 декабря 2011

Есть ли у вас @Service или аналогичная аннотация в вашем классе JavaMailSenderImpl? Это приведет к тому, что компонентный сканер Spring поместит его экземпляр в контейнер Spring, который он может затем автоматически связать с EmailServiceImpl.

1 голос
/ 27 декабря 2011

Из сообщения об ошибке я могу сделать вывод, что автопроводка работает, но не может найти требуемый компонент.

Убедитесь, что вы загрузили все файлы определений бина.

1 голос
/ 27 декабря 2011

Вам нужно добавить <context:annotation-config/> в ваш файл конфигурации, чтобы Spring автоматически связывал аннотированные компоненты.

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

...