第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

Cats萌萌 2023-07-13 14:06:14
我有一個郵件服務(wù),它只是向收件人發(fā)送通知。@Servicepublic class MailService {        @Autowired        private JavaMailSender mailSender;        public void send(String subject, String text, String... emails) {                // MailMessage object configuration                mailSender.send(mail);        }}然后我有一個休息控制器,在一些業(yè)務(wù)邏輯之后調(diào)用這個方法。@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", "1@mail.com");        }}我應(yīng)該如何設(shè)計一個應(yīng)用程序來關(guān)閉不同彈簧配置文件的通知?是否有根據(jù)配置文件配置電子郵件分發(fā)的最佳實踐?
查看完整描述

3 回答

?
慕姐8265434

TA貢獻(xiàn)1813條經(jīng)驗 獲得超2個贊

使用多種實現(xiàn)

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


public interface MailService {

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

}

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


@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);

    }

}

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


@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");

    }

}

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


使用方面

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


這允許您完全刪除控制器MailService的依賴關(guān)系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", "1@mail.com");

    }

}

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


要在 Spring boot 中使用切面,您應(yīng)該添加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", "1@mail.com");

        }

    }

}

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


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


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


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

TA貢獻(xiàn)1824條經(jīng)驗 獲得超8個贊

只需為需要它的配置文件提供一個虛擬實現(xiàn)


@Bean

@Profile("prod")

public JavaMailSender getRealJavaMailSender() {

    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();

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

    mailSender.setPort(587);

     

    mailSender.setUsername("my.gmail@gmail.com");

    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 ...

    };

}


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

TA貢獻(xiàn)1818條經(jīng)驗 獲得超11個贊

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


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


@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);

        }

    }

}

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


查看完整回答
反對 回復(fù) 2023-07-13
  • 3 回答
  • 0 關(guān)注
  • 198 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號