[Spring] applicationContext voor mail configuratie

Pagina: 1
Acties:
  • 114 views sinds 30-01-2008
  • Reageer

  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Hoi allemaal,

Ik probbeer via applicationContext.xml aantal beans te configureren die nodig zijn voor email functionaliteit. Ik maak gebruik van MimeMessage voor email bericht, omdat ik bijlagen moet kunnen versturen.
Eerst getest met simpleMailMessage en alles werkte. Toen de bean aangepast naar MimeMessage:
code:
1
2
3
4
5
6
7
8
<bean id="enrollmentMailMessage" class="javax.mail.internet.MimeMessage">
  <property name="from">
   <value>a@b.com</value>
  </property>
  <property name="subject">
   <value>Course enrollment report</value>
  </property>
 </bean>

Met MimeMessage krij ik de volgende error:
code:
1
2
3
4
5
6
7
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'enrollmentMailMessage' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.FatalBeanException: Could not instantiate class [javax.mail.internet.MimeMessage]: no default constructor found; nested exception is java.lang.NoSuchMethodException: javax.mail.internet.MimeMessage.<init>()

org.springframework.beans.FatalBeanException: Could not instantiate class [javax.mail.internet.MimeMessage]: no default constructor found; nested exception is java.lang.NoSuchMethodException: javax.mail.internet.MimeMessage.<init>()

java.lang.NoSuchMethodException: javax.mail.internet.MimeMessage.<init>()
at java.lang.Class.getConstructor0(Class.java:2647)
...


Nu heb ik kunnen uitvissen dat dit veroorzaakt wordt door het onbreken van een empty constructor voor MimeMessage. Default constructor daarvoor is MimeMessage(Session session) waarbij Session afkomstig is van javax.mail.Session. En die heeft natuurlijk helemaal geen constructor. (Normaliter haal je een sessie op d.m.v. Session.getInstance()).

Hoe geef ik dus een Session.getInstance() als argument mee aan MimeMessage?
Ik tot zover gekomen, maar nog geen succes gehad:
code:
1
2
3
4
5
6
<bean id="session" class="javax.mail.Session" factory-method="getInstance"/>

<bean id="enrollmentMailMessage" class="javax.mail.internet.MimeMessage" >
  <constructor-arg><ref bean="session"/></constructor-arg>
  ...
</bean>

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Een factory-method is hier idd voor bedoeld, maar waarom gebruik je de Spring mail abstractie niet gewoon om je email systeem op te zetten?

[ Voor 3% gewijzigd door -FoX- op 12-06-2006 10:48 ]


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
De reden is scheduling.
In ApplicationContext is cronTrigger opgenomen die een repotJob aanroept. En om de "emailService" te gebruiken is het handig (dacht ik) om via de applicationContext die objecten alvast te initaliseren en mee te geven. Want dit is waar Spring zo goed in hoort te zijn. Objecten initialiseren (via de applicationContext) zonder ze afzonderlijk te hoeven initialiseren.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 19-02 23:22

Janoz

Moderator Devschuur®

!litemod

ZOals ook in de foutmelding al aangegeven wordt is er geen constructor die Spring kan gebruiken om het object aan te maken. Dit is te verifieren via de javadoc (http://java.sun.com/j2ee/...internet/MimeMessage.html).

Verder vind ik het trouwens een beetje vreemde constructie. Voor mailen gebruik ik zelf gewoon een service die de verschillende velden accepteerd. Daarnaast is een mail iets wat je niet 1x aan het begin van je applicatie aan wilt maken, maar meer op het moment dat je daadwerkellijk een mailtje wilt versturen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Tnx, ik was er ookal achter dat het iets met de constructor te maken had ;)
Maar het initialiseren d.m.v. MimeMessage(Session session) in ApplicationContext zou ik graag onder de knie willen krijgen.
Hoe kan ik een bean (Session) aan de constructor koppelen die zelf ook geen default constructor heeft.

B.t.w.: Buiten de applicationContext heb ik het trouwens wel werkend. (Zie code)
Java:
1
2
3
4
5
6
7
8
9
10
Properties prop = new Properties();
message = new MimeMessage(Session.getInstance(prop));
            
MimeMessageHelper temp = new MimeMessageHelper(message);
InternetAddress adress = new InternetAddress("a.b@com.nl");
message.addRecipients(Message.RecipientType.TO, adress.getAddress());
message.setFrom(new InternetAddress("a.b.@com.nl"));
message.setSubject("Current enrollment data");
message.setText(messageText.toString());
mailSender.send(temp.getMimeMessage());

[ Voor 49% gewijzigd door turkosh op 12-06-2006 14:41 ]


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 03-02 20:14
In je gewone code geef je nog een argument mee aan de factory method, en bij het aanmaken van je bean in application context niet... probeer het volgende dan es (natte vinger werk hoor, maar ik denk dat je zo ook argumenten kan meegeven aan je factory method)

code:
1
2
3
4
5
    <bean id="session" class="javax.mail.Session" factory-method="getInstance">
        <constructor-arg>
            <value>foo=fooValue</value>
        </constructor-arg>
    </bean>

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
tnx, ik denk dat ik toch voor de message opbouw voor de emailService toch ga voor "good old" java programmeren. Heb gemerkt dat als ik het fatsoenlijk wil configureren in applicationContext, dat ik door de bonen het bos niet meer zie 8)7
En in de emailservice (klasse) ben ik in 5 regeltjes klaar ;)
Tot zover niet echt gecharmeerd door Spring dus...
Pagina: 1