implementation of interface is carried out using abstract class instead of concrete class.
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'contactController':
Unsatisfied dependency expressed through field 'emailService': No qualifying bean of type [com.proto.backendservice.EmailService] found for dependency [com.proto.backendservice.EmailService]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)};
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.proto.backendservice.EmailService] found for dependency [com.proto.backendservice.EmailService]: expected at least 1 bean which qualifies as autowire candidate for this dependency.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}.
ContactController
package com.proto.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.proto.backendservice.EmailService;
import com.proto.domainFrontend.FeedBackPojo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Controller
public class ContactController {
private static final Logger LOG=LoggerFactory.getLogger(ContactController.class);
public static final String FEEDBACK_MODEL_KEY="feedback";
private static final String CONTACT_US_VIEW_NAME="contact";
@Autowired
private EmailService emailService;
@RequestMapping(value="/contact",method=RequestMethod.GET)
public String contactGet(ModelMap model){
FeedBackPojo feedBackPojo=new FeedBackPojo();
model.addAttribute(ContactController.FEEDBACK_MODEL_KEY, feedBackPojo);
return ContactController.CONTACT_US_VIEW_NAME;
}
@RequestMapping(value="/contact",method=RequestMethod.POST)
public String contactPost(@ModelAttribute(FEEDBACK_MODEL_KEY) FeedBackPojo feedback){
LOG.debug("feedback pojo content:{}",feedback);
emailService.sendFeedBackEmail(feedback);
return ContactController.CONTACT_US_VIEW_NAME;
}
}
interface EmailService
package com.proto.backendservice;
import org.springframework.mail.SimpleMailMessage;
import com.proto.domainFrontend.FeedBackPojo;
public interface EmailService {
public void sendFeedBackEmail(FeedBackPojo feedBackPojo);
public void sendGenericEmailMessage(SimpleMailMessage message);
}
abstract class AbstractEmailService
package com.proto.backendservice;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import com.proto.domainFrontend.FeedBackPojo;
@Service
public abstract class AbstractEmailService implements EmailService{
@Value("${default.to.address}")
private String defaultToAddress;
protected SimpleMailMessage prepareSimpleMailMessageFromFeedBackPojo(FeedBackPojo feedback){
SimpleMailMessage message=new SimpleMailMessage();
message.setTo(defaultToAddress);
message.setFrom(feedback.getEmail());
message.setSubject("[Protoweb:Feedback Received from"+feedback.getFirstName()+" "+feedback.getLastName()+"!");
message.setText(feedback.getFeedBack());
return message;
}
@Override
public void sendFeedBackEmail(FeedBackPojo feedBackPojo){
sendGenericEmailMessage(prepareSimpleMailMessageFromFeedBackPojo(feedBackPojo));
}
}
class MockMailService
package com.proto.backendservice;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Service;
@Service
public class MockMailService extends AbstractEmailService {
private static final Logger LOG=LoggerFactory.getLogger(MockMailService.class);
@Override
public void sendGenericEmailMessage(SimpleMailMessage message) {
LOG.debug("Simulating an email service....");
LOG.info(message.toString());
LOG.debug("Email Sent");
}
}
application.properties
spring.profile.active=dev
default.to.address=xxx@gmail.com
application-prod.properties
spring.mail.host=smtp.gmail.com
spring.mail.username=xxx@gmail.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.socketFactory.port=465
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.socketFactory.fallback=flase
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.ssl.enable=true