亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有一個漂亮的解決方案來禁用所有電子郵件通知?

有沒有一個漂亮的解決方案來禁用所有電子郵件通知?

Cats萌萌 2023-07-13 14:06:14
我有一個郵件服務,它只是向收件人發送通知。@Servicepublic class MailService {        @Autowired        private JavaMailSender mailSender;        public void send(String subject, String text, String... emails) {                // MailMessage object configuration                mailSender.send(mail);        }}然后我有一個休息控制器,在一些業務邏輯之后調用這個方法。@RestControllerpublic class MyRestController {        @Autowired        private MailService mailService;        @PostMapping("/orders")        public void createOrders(@RequestBody List<Order> orders) {                // manipulations with orders                mailService.send("Order notification", "New orders", "[email protected]");        }}我應該如何設計一個應用程序來關閉不同彈簧配置文件的通知?是否有根據配置文件配置電子郵件分發的最佳實踐?
查看完整描述

3 回答

?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

使用多種實現

一種可能性是創建MailService具有兩個實現的接口。通過將這些實現與@Profile注釋相結合,您可以根據您使用的配置文件正確注入一種或另一種實現。例如:


public interface MailService {

    void send(String subject, String text, String... emails);

}

然后您可以將@Profile("mail")注釋添加到一個實現中:


@Service

@Profile("mail") // Only create this bean when the 'mail' profile is used

public class JavaMailServiceImpl implements MailService {


    @Autowired

    private JavaMailSender mailSender;


    public void send(String subject, String text, String... emails) {

        // MailMessage object configuration

        mailSender.send(mail);

    }

}

此外,您可以在郵件配置文件未激活時添加另一個實現:


@Service

@Profile("!mail") // By adding the exclamination mark, this implementation will be used when the mail profile isn't active

public class NoopMailServiceImpl implements MailService {

    private final Logger logger = LoggerFactory.getLogger(getClass());


    @Override

    public void send(String subject, String text, String... emails) {

        logger.debug("Dummy implementation, no e-mail is being sent");

    }

}

如果您現在自動連接MailService到控制器中,它將根據您使用的配置文件正確實現正確的實現。


使用方面

另一種替代方法是使用方面將發送郵件與訂單創建邏輯完全解耦。


這允許您完全刪除控制器MailService的依賴關系MyRestController:


@RestController

public class MyRestController {


    @PostMapping("/orders")

    public void createOrders(@RequestBody List<Order> orders) {

        // manipulations with orders

    }

}

相反,您可以將mailService邏輯添加到單獨的方面:


@Aspect

@Component

@Profile("mail")

public class OrderNotificationAspect {

    private final MailService mailService;


    public OrderNotificationAspect(MailService mailService) {

        this.mailService = mailService;

    }


    @AfterReturning("execution(* com.example.MyRestController.createOrders(..))")

    public void sendNotification() {

        mailService.send("Order notification", "New orders", "[email protected]");

    }

}

像以前一樣,我們使用@Profile注釋僅在郵件配置文件處于活動狀態時注冊方面 bean。然而,由于我們不再直接將控制器綁定到MailService我們不再需要“虛擬實現”。


要在 Spring boot 中使用切面,您應該添加spring-boot-starter-aop依賴項。


以編程方式檢查配置文件

另一種選擇是在代碼中編寫檢查,例如:


@RestController

public class MyRestController {


    @Autowired

    private MailService mailService;

    @Autowired

    private Environment environment;  


    @PostMapping("/orders")

    public void createOrders(@RequestBody List<Order> orders) {

        // manipulations with orders

        if (environment.acceptsProfiles(Profiles.of("mail"))) {

            mailService.send("Order notification", "New orders", "[email protected]");

        }

    }

}

根據您希望此邏輯的細粒度程度,您可以將其放入控制器或服務中(如果您想禁用為特定配置文件發送的所有電子郵件)。


您選擇哪個選項取決于您的需求。使用多種實現是禁用所有郵件發送的最簡單方法。


但是,如果您只想禁用某些郵件的發送,則必須選擇其他方式。使用方面的缺點是它有時會使流程更難以遵循,盡管 IDE 對方面有很好的支持。


查看完整回答
反對 回復 2023-07-13
?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

只需為需要它的配置文件提供一個虛擬實現


@Bean

@Profile("prod")

public JavaMailSender getRealJavaMailSender() {

    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();

    mailSender.setHost("smtp.gmail.com");

    mailSender.setPort(587);

     

    mailSender.setUsername("[email protected]");

    mailSender.setPassword("password");

     

    Properties props = mailSender.getJavaMailProperties();

    props.put("mail.transport.protocol", "smtp");

    props.put("mail.smtp.auth", "true");

    props.put("mail.smtp.starttls.enable", "true");

    props.put("mail.debug", "true");

     

    return mailSender;

}


@Bean

@Profile("test")

public JavaMailSender getDummyJavaMailSender() {

    return new JavaMailSender() {

        ... dummy method implementations ...

    };

}


查看完整回答
反對 回復 2023-07-13
?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

sendEmails=false我建議向 application-[profile-name].properties 文件添加一個變量(例如),每個配置文件具有不同的設置。


然后,在您的代碼中,您可以使用此屬性來決定是否應發送電子郵件。


@Service

public class MailService {


    @Value("sendEmails}")

    private boolean sendEmails;


    @Autowired

    private JavaMailSender mailSender;


    public void send(String subject, String text, String... emails) {

        if (sendEmails) {

            // MailMessage object configuration

            mailSender.send(mail);

        }

    }

}

這種方法使您能夠為每個配置文件使用不同的(且易于更改的)設置。


查看完整回答
反對 回復 2023-07-13
  • 3 回答
  • 0 關注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號