2011-12-27 16 views
6

Estoy tratando de implementar la funcionalidad de correo electrónico en mi aplicación, pero me siguen dandode beans Spring Autowiring error

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. 

Puede alguien señalar lo que estoy haciendo mal?

La configuración XML para el bean es:

clase
<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

Respuesta

2

Gracias a todos por sus respuestas. No he podido conseguir el autowiring a trabajar, pero me dio la solución de correo electrónico en general a trabajar de la siguiente manera:

  1. setup la mailSession en WebLogic, con un nombre JNDI de "myMailSession"

añadir a 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> 

añadir a 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> 

añadir a 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

Me enfrenté al mismo problema y todo funcionó cuando se configuró en xml. elimina las anotaciones autowired y @service del servicio bean emailServiceImpl. El autoenvío funciona bien en otros granos. Me pregunto qué pasa con el autoenvío en JavaMail. –

1

Es necesario añadir <context:annotation-config/> a su archivo de configuración con el fin de primavera a Autowire anotado frijoles.

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

+0

Lo he intentado y me da el mismo error. Lo agregaré nuevamente a mi publicación original. ¿Alguna otra idea? – flynfish

+0

Hay otras 2 cosas que podrías probar. Agregue otra línea en su xml para especificar dónde buscar su bean \t y también intente configurar el atributo autowire-candidate en true en el bean del remitente del correo electrónico. – Travis

+0

Pude reproducir el error y el escaneo de componentes debería solucionar su problema. – Travis

1

De mensaje de error, puedo concluir que autowiring está trabajando, pero no es capaz de encontrar el grano requerido.

Asegúrese de cargar todos los archivos de definición de bean.

1

¿Tiene una @Service o anotación similar en su propia clase JavaMailSenderImpl? Esto causará que el escáner de componentes de Spring coloque una instancia en el contenedor de resorte, que luego se puede conectar automáticamente al EmailServiceImpl.

1

Así es como me fijo:

me encontré con este problema también, traté de seguir tutoriales sencillos en línea que funcionó perfectamente durante las pruebas cargando manualmente el archivo app-context.xml, pero cuando traté de ejecutar mi aplicación Spring mvc, seguía mostrando este error:

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 

Después de probar todo tipo de cosas, sucedió que moví estas dos líneas de mi archivo de configuración JPA/DB a la parte inferior de mi archivo de configuración de root.

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

Todavía estoy aprendiendo Primavera, pero estoy pensando que hubo un problema con el orden en que aparecen.

Editar: Esta pregunta parece aclarar la cuestión con el fin de:

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

4

he tenido problemas con este mismo problema para una clase de servicio de correo electrónico codificados como:

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

I stumbled en una solución al leer sobre un tema relacionado. El punto clave es que la interfaz JavaMailSender se define en el applicationContext.xml como la clase Spring JavaMailSenderImpl.

Paso 1: El archivo de contexto de aplicación se modificó para incluir la siguiente definición de frijol:

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

Paso 2: La clase de servicio de correo electrónico se modificó para quedar así:

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

Voila! Spring es feliz. I sería aunque me gustaría escuchar una explicación adecuada del error original.

Cuestiones relacionadas