2017-11-14 12 views
1

私はGOOFデザインパターンを実装したSpring電子メールサービスを実装しようとしています。私は次のようにインタフェースの電子メールサービスを作成しました。spring emailが動作しない

パブリックインターフェースEmailService {

public void sendFeedbackEmail(FeedbackPojo feedbackPojo); 

public void sendGenericEmailMessage(SimpleMailMessage message); 

}

そして私はこのインタフェースを拡張し、それは次のように、この抽象クラスの実装であるsendFeedbackEmail(FeedBackPojo feedbackpojo)あるメソッドをオーバーライド年代のいずれかを実装する抽象クラスを作成しました。

public abstract class AbstractEmailService implements EmailService { 

@Value("@{default.to.address}") 
private String defaultToAddress ; 

protected SimpleMailMessage preparedSimpleMailMessageFromFeedbackPojo(FeedbackPojo feedback){ 
    SimpleMailMessage message = new SimpleMailMessage(); 
    message.setTo(defaultToAddress); 
    message.setFrom(feedback.getEmail()); 
    message.setSubject("[Subscriber]: Feedback Received from"+ feedback.getFirstName()+" "+feedback.getLastName()+"!"); 
    message.setText(feedback.getFeedback()); 

    return message; 
} 

@Override 
public void sendFeedbackEmail(FeedbackPojo feedbackPojo) { 
    sendGenericEmailMessage(preparedSimpleMailMessageFromFeedbackPojo(feedbackPojo)); 
} 

}

パブリッククラスMockEmailServiceがAbstractEmailService {

を拡張し、以下のようにIはsendGenericEmail(SimpleMailMessageメッセージ)であるEmailServiceインタフェースの第2の方法の実装とクラスMockEmailServiceを作成
private static final Logger log = 
LoggerFactory.getLogger(MockEmailService.class); 

@Override 
public void sendGenericEmailMessage(SimpleMailMessage message) { 
    System.out.println(message.toString()); 
} 

}

私がしようとすると、

は、その後、私は、私のコントローラクラスにemailServiceのAutowiredオブジェクトを作成し、しかし

@Controller 

パブリッククラスContactController {

private static final org.slf4j.Logger log = LoggerFactory.getLogger(ContactController.class); 
public static final String FEEDBACK_MODEL_KEY="feedback"; 
private static final String CONTACT_US_VIEW_NAME="contact/contact"; 

@Autowired 
private EmailService emailService; 


@RequestMapping(value = "/contact",method = RequestMethod.GET) 
public String getContact(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 postContact(@ModelAttribute(FEEDBACK_MODEL_KEY) FeedbackPojo feedback){ 
    log.debug("Feedback content {}",feedback); 
    emailService.sendFeedbackEmail(feedback); 
    return ContactController.CONTACT_US_VIEW_NAME; 
} 

}

を次のように私のemailserviceをシミュレートしています私のアプリケーションを実行すると、アプリケーションは終了し、エラーは次のようになります。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'contactController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.subscriptionservice.backend.service.EmailService com.subscriptionservice.web.controllers.ContactController.emailService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.subscriptionservice.backend.service.EmailService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

私の実装で誰かが問題を指摘できますか?ありがとう。

答えて

3

依存私の知る限り見るように

見つかりタイプ [com.subscriptionservice.backend.service.EmailService]なし予選Beanは、あなたのインターフェイスEmailServiceのインスタンスを導入していませんSpring管理のBeanのコレクションに追加します。

MockEmailServiceに注釈(ステレオタイプ)を試みてください。としてください。

また...

  • あなたはMockEmailServiceが存在するパッケージが含まれます方法で、どこかcomponent-scanを定義していることを確認してください。
  • MockEmailServiceは、お客様のアプリケーションにEmailServiceという契約を永久に適用するつもりはありますか? MockEmailServiceは、実稼働環境以外の展開やテストなどの特定の状況のみを対象としている場合、Beanの定義や配線に柔軟性のあるシステムが必要な場合があります。Spring Profilesのような多くのオプションがあります。
+0

ありがとうございました。これは、MockEmailServiceに注釈を付けた後に機能します。はい、MockEmailServiceは実稼働環境以外の展開用です。私は別の春のプロファイルを維持しています。 –

関連する問題