2012-01-22 49 views
0

有没有办法阻止对Play Mailer class的呼叫?拦截对邮件程序操作的呼叫

我想记录我的应用程序发送的所有电子邮件。我想访问邮件程序方法参数和方法名称,并记录所有这些。

我一直在使用@With尝试过,但我的@Before方法不叫:

@With(EmailInterceptor.class) 
public class Mails extends Mailer { 

    public static void welcome(User user) { 
     setSubject("Welcome to my app"); 
     setFrom("Me <[email protected]>"); 
     addRecipient(user.email); 

     Mailer.send(user); 
    } 
} 

public final class EmailInterceptor extends UserAwareControllerBase { 
    private final static Logger logger = LoggerHelper.getLogger(); 

    @Before 
    public void logEmail(){ 
     String email = getUser() == null ? "<null>" : getUser().email; 
     logger.info("Sending email to " + email); 
    } 
} 

回答

2

AFAIK没有对梅勒没有拦截。检查https://github.com/playframework/play/blob/master/framework/src/play/mvc/ActionInvoker.java。转到第142行,这清楚地表明只有控制器会得到拦截。

+0

太糟糕了。现在我会接受你的答案,并将日志记录代码复制粘贴到所有邮件方法......希望在未来的某个时候这将改变。 – ripper234

+0

我认为这是一种解决方法,只需使用Mails类中定义的静态方法包装Mailer.send(...)调用即可。将你想拦截的逻辑放入该方法中,然后调用该方法而不是Mailer.send。这应该是一个简单的方法来做你想做的事情 –