2017-01-09 2 views
0

내 응용 프로그램에서 HTML 메일 발신자를 만들려고했지만이 오류가 발생했습니다. 다음은 네임 스페이스를 사용하는 구성입니다.필드를 autowire 할 수 없습니다 : private org.springframework.mail.javamail.JavaMailSender [Spring 4.0.0 REALEASE]

<?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"> 

    <context:property-placeholder location="classpath*:/mail_server.properties" /> 
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSender"> 
     <property name="host" value="${host}"/> 
     <property name="port" value="${port}"/> 
     <property name="username" value="${username}"/> 
     <property name="password" value="${password}"/> 
     <property name="javaMailProperties"> 
      <props> 
       <prop key="mail.transport.protocol">smtp</prop> 
       <prop key="mail.smtp.auth">true</prop> 
       <prop key="mail.smtp.starttls.enable">true</prop> 
       <prop key="mail.debug">true</prop> 
      </props> 
     </property> 
    </bean> 
</beans> 

그런 다음 스프링 프로젝트의 applicationContext.xml 파일로 가져 왔습니다. 자바 클래스에서 난 그냥 HTML 메일을 보내는 방법을 써주세요.

import java.io.UnsupportedEncodingException; 
import java.util.Date; 

import javax.inject.Inject; 
import javax.mail.MessagingException; 
import javax.mail.internet.MimeMessage; 

import org.springframework.mail.MailException; 
import org.springframework.mail.SimpleMailMessage; 
import org.springframework.mail.javamail.JavaMailSender; 
import org.springframework.mail.javamail.MimeMessageHelper; 
import org.springframework.stereotype.Repository; 

import fi.vietjob.bean.mail.Mail; 

@Repository 
public class mailFeature { 
    @Inject 
    private JavaMailSender mailSender; 

    public JavaMailSender getMailSender() { 
     return mailSender; 
    } 

    public void setMailSender(JavaMailSender mailSender) { 
     this.mailSender = mailSender; 
    } 

    public void getPalaute(Mail mail, String to) { 
     SimpleMailMessage message = new SimpleMailMessage(); 
     message.setSubject(mail.getSubject()); 
     message.setText(mail.getText()); 
     message.setFrom(mail.getFrom()); 
     message.setSentDate(new Date()); 
     mailSender.send(message); 
    } 

    public void sendHTMLEmail(Mail mail, String to, String senderName) { 

     try { 
      MimeMessage mime = mailSender.createMimeMessage(); 
      MimeMessageHelper helper = new MimeMessageHelper(mime, true); 
      helper.setFrom(mail.getFrom(), senderName); 
      helper.setText(mail.getText()); 
      helper.setSubject(mail.getSubject()); 
      helper.setSentDate(new Date()); 
      helper.setTo(to); 
      mailSender.send(mime); 
     } catch (MailException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (MessagingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

그리고 내가 그것을 실행할 때, 내가 stackstrace 가지고 : 당신은이 방법으로 메일 보낸 사람을 만든 XML 파일에서

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mailFeature': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.mail.javamail.JavaMailSender fi.vietjob.feature.mailFeature.mailSender; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying 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: {@javax.inject.Inject()} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:643) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:606) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:657) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:525) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:466) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1241) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1154) 
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1041) 
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4969) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5255) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
+0

당신이를 주입 주석 대신를 autowire 주석를 시도 ? – Alee

+0

나는 똑같은 형제라고 생각하고, 그냥 시도해 보았다. –

+0

bean 정의에'autowire = "byName"'을 추가해보십시오. 그리고'@ Autowired '를 사용하십시오. –

답변

1

을 :

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSender"> 
    <property name="host" value="${host}"/> 
    <property name="port" value="${port}"/> 
    <property name="username" value="${username}"/> 
    <property name="password" value="${password}"/> 
    <property name="javaMailProperties"> 
     <props> 
      <prop key="mail.transport.protocol">smtp</prop> 
      <prop key="mail.smtp.auth">true</prop> 
      <prop key="mail.smtp.starttls.enable">true</prop> 
      <prop key="mail.debug">true</prop> 
     </props> 
    </property> 
</bean> 

그래서 스프링 빈을 생성 id가있는 경우 mailSender 리포지토리에 주입하려고하면 @Inject; @Inject

@Qualifier를 사용하려고 그래서 작성하려고 :

@Repository 
public class mailFeature { 
    @Inject 
    @Qualifier("mailSender") 
    private JavaMailSender mailSender; 
.... 
} 

그것은

작동합니다 나는 그것이

안젤로 유용 희망

+0

고마워 형제, 직장에서 집에 돌아 왔을 때 해보고 알려 드리겠습니다. –

+0

그것은 형제 님, 나는 ur 가이드를 따르고 JavaMailSenderImpl 대신 JavaMailSender를 변경합니다. 미리 감사드립니다. 그러나 나는 정말로 이해하지 않는다, 당신은 나를 위해 설명 할 수 있냐. 왜냐하면 우리가 알고있는 것처럼, 한정자 주석은 같은 유형을 가진 bean 이상을 가지고있을 때만 사용되지만, 나의 애플리케이션에서는 JavaMailSender만을 선언 할 것이기 때문에?! –

+0

요점은 XML 파일에서 id가'mailSender' 인 빈을 선언했다는 것입니다. '@Inject' 및/또는'@ Autowired'를'@ 한정자 '와 함께 사용하지 않으면 spring은 bean 이름에 id.eqauals를 가진 bean을 검색합니다. 귀하의 경우 그것은'javaMailSender'와'mailSender'가없는 빈을 찾습니다 –