本日 web.xml に Listener リスナーが追加されたときに例外が発生しました。
Tomcat サーバーの起動時にアーティファクトのデプロイが失敗する
ログをチェックして、dao レイヤーを参照する Bean が注入されていないことを確認します。
org.springframework.beans.factory.NoSuchBeanDefinitionException: 'ProductTypeService' という名前の Bean がありません
この時点で、関連する Bean インジェクションが完了しているかどうかを確認する必要があります。コードを見ると、実際に Bean インジェクションが欠落していることがわかります。
Bean インジェクションを手動で追加しました:
この時点で認識されると思っていたのですが、意外にも同じエラーが報告されています!
よく考えて、リスナーのコードを確認してください。リスナーは ServletContextListener インターフェイスを実装しています。これはグローバル リスナーです。つまり、プロジェクトが開始されたときに有効になるため、出力メッセージを追加しました。リスナー"
import com.konan.pojo.ProductType;
import com.konan.service.ProductTypeService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.List;
public class ProductTypeListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("进入监听器");
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext_*.xml");
ProductTypeService productTypeService = (ProductTypeService) context.getBean("ProductTypeService");
List<ProductType> allType = productTypeService.getAllType();
System.out.println(allType);
sce.getServletContext().setAttribute("typeList",allType);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
コンソールを再起動して表示します。
アーティファクトがデプロイされた後にリスナーが有効になっていることがわかりますが、アーティファクトはまだデプロイされていません!
その後、同じエラーが報告されました
この時点で、注入された Bean ProductTypeService を認識できないのはなぜですか? 明らかに注入されています!
リスナーが取得する必要があるのは、ProductTypeServiceImpl の上位層インターフェースである ProductTypeService ビジネス層の Bean です。リスナーの有効時間が早いため、自動的に注入された Bean の参照名はまだ有効になっていません (実際、Bean は注入されていますが、リスナーはこの時点でそれを認識できず、小文字のイニシャルクラス名は役に立たない)、この時点でカスタム Bean 名を使用する時が来ました!
@Service("bean") を追加
- Bean 名をカスタマイズします。@Service("aaaaa") を指定できます。この Bean はデフォルトでシングルトンです
- 指定がない場合のデフォルト名はクラス名(頭文字小文字)、
最後に、次の形式に変更すると、正常に実行できます。