Groovy Adventures

A developer's journey.

A Groovy Java Puzzler: Setting a Property When Its Setter Is Overloaded

| Comments

Trying out Spring’s email support, I wanted to send a simple message to a single recipient using code like:

1
2
3
4
SimpleMailMessage mailMessage = new SimpleMailMessage()
mailMessage.to = 'me@trash-mail.com'
// ...
mailSender.send(mailMessage)

To my astonishment this threw an exception:

1
2
3
4
5
6
7
8
9
10
11
12
13
javax.mail.internet.AddressException: Missing local name in string ``@''
  at javax.mail.internet.InternetAddress.checkAddress(InternetAddress.java:1209)
  at javax.mail.internet.InternetAddress.parse(InternetAddress.java:1091)
  at javax.mail.internet.InternetAddress.parse(InternetAddress.java:633)
  at javax.mail.internet.InternetAddress.parse(InternetAddress.java:610)
  at org.springframework.mail.javamail.MimeMessageHelper.parseAddress(MimeMessageHelper.java:707)
  at org.springframework.mail.javamail.MimeMessageHelper.setTo(MimeMessageHelper.java:593)
  at org.springframework.mail.javamail.MimeMailMessage.setTo(MimeMailMessage.java:109)
  at org.springframework.mail.SimpleMailMessage.copyTo(SimpleMailMessage.java:194)
  at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:305)
  at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:297)
  at org.springframework.mail.MailSender$send.call(Unknown Source)
  ...

Taking a closer look, I recognized that the setTo method of SimpleMailMessage is overloaded as follows:

1
2
public void setTo(String to)
public void setTo(String[] to)

Spring @Transactional With AspectJ

| Comments

If we want to use the @Transactional annotation on private methods, we cannot use Spring’s default proxy mode - it only works for public methods that are called from client code.

For self-invoked methods we need to use AspectJ.