0

I am trying to implement mail sending capability to my web App. The problem is with JavaMailSender which is not getting auto wired neither when running the app nor when unit-testing. I really don't get it why it does not want to instantiate the JavaMailSender object. I have properly set both application.properties as well as application-test.properties.

application.properties & application-test.properties

spring.mail.host=mail.xxx.com
spring.mail.username=noreply@xxx.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.port=587
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

My EmailSender.class

@Component
public class EmailSender {

    private static final Logger log = LoggerFactory.getLogger(EmailSender.class);

    @Autowired
    private JavaMailSender mailSender;

    @Autowired
    private Configuration freeMarkerConfig = null;
    @Autowired
    private JujuServerProperties serverProperties = null;

    private List<RuntimeTypeAdapterFactory> adapterFactoryList;

    private AbstractSamplePostSynchroActions abstractSamplePostSynchroActions;

    //FIXME CE CODE EST A 2 ENDROITS (SendEmailProcessor)
    public void send(int projectId,int questionnaireId, int terminalId) {
        try {

            // TODO: Revoir certaind crite pour l<envoi de courrier test. Ceci devrait inclure la presence des entree postSynchro dans la BD. valider la correspondance avec une question email dans le questionnaire
            adapterFactoryList = new ArrayList<>();
            adapterFactoryList.add(prepareMediaQuestionAdapters());
            adapterFactoryList.add(prepareSocialMediaAdapters());
            adapterFactoryList.add(prepareConditionAdapters());

            ObjectMapper mapper = new ObjectMapper();
            File fic = new File(IOUtils.getTerminalDir(projectId, questionnaireId,terminalId)+ File.separator+"Email"+File.separator+"email.json");

            Email emailConfig = EmailUtil.generateEmailConfigurationFromJsonFile(fic,adapterFactoryList);

            ConditionsEvaluator conditionsEvaluator = emailConfig.getConditionsEvaluator();

            Map<String, Object> model = new HashMap<>();
            PostSynchroUtil.generateEmail(projectId,questionnaireId,terminalId,adapterFactoryList);
            File file = new File(IOUtils.getTerminalDir(projectId, questionnaireId,terminalId)+"Email"+File.separator+"email.xml");
            //initEmailModel(model, respondent);
            SampleEmailData sample = (SampleEmailData)abstractSamplePostSynchroActions;
            MimeMessagePreparator preparator = mimeMessage -> {
                MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
                for(QuestionCondition questionCondition : conditionsEvaluator.getConditions())
                {
                    if(questionCondition.getQuestion_type().contains("email"))
                    {

                        String emailAddr = sample.getEmailAddrs();
                        message.setTo(emailAddr);
                    }
                }

                message.setFrom("noreply@nomadlogicapp.com","noreply@nomadlogicapp.com");
                message.setSubject("Test Email From Juju Console");
                StringWriter out = new StringWriter();




                message.setText(sample.getMsg(),true);
            };

            this.mailSender.send(preparator);


        } catch (Exception ex) {
            log.error("{}", ex);
        }
    }

    private void initEmailModel(Map<String, Object> model, IRespondent respondent, Email email) {
        model.put("email", email);
        model.put("respondent", respondent);
        model.put("server", serverProperties.getServerAdress());

    }

    public AbstractSamplePostSynchroActions getAbstractSamplePostSynchroActions() {
        return abstractSamplePostSynchroActions;
    }

    public void setAbstractSamplePostSynchroActions(AbstractSamplePostSynchroActions abstractSamplePostSynchroActions) {
        this.abstractSamplePostSynchroActions = abstractSamplePostSynchroActions;
    }
}

Spring Configuration class

package com.nomadlogic.juju;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;


@ConfigurationProperties(prefix = "juju-server")
@Component
public class JujuServerProperties {
    private String address;
    private String port;
    private String dns;

    public String getServerAdress() {
        return this.address + ":" + this.port;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPort() {
        return port;
    }

    public void setPort(String port) {
        this.port = port;
    }

    public String getDns() {
        return dns;
    }

    public void setDns(String dns) {
        this.dns = dns;
    }
}
Nesan Mano
  • 1,892
  • 2
  • 26
  • 43
  • Do you see any log entries related to mail? – Kamil May 14 '19 at 22:49
  • Simply put an `@Autowired` field cannot be `null`, if Spring cannot find a satisfying bean your application will blow up and won't start. My guess you are doing `new EmailSender()` instead of autowiring this cllass. – M. Deinum May 15 '19 at 05:57
  • Replace spring.mail.properties.mail.smtp.port=587 with spring.mail.port=587 – Adib Rajiwate May 15 '19 at 07:03
  • The log contains a line with a null pointer exception. Basically, it is because emailSender is null. – Nesan Mano May 15 '19 at 14:21
  • I have found the solution. A class marked with @Component must be instantiated using Auto wired since we cannot use both java instantiation in a class that contains other Auto wired components. A detailed explanation can be found here: https://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null – Nesan Mano May 15 '19 at 14:51

0 Answers0