21

私はSpringが初めてで、クラス属性で ServletContext に @Autowire アノテーションを使用しようとしています:

@Controller
public class ServicesImpl implements Services{

    @Autowired
    ServletContext context;

このクラスの Bean を、dispatcher-servlet.xml で定義しました。

<bean id="services" class="com.xxx.yyy.ServicesImpl" />

しかし、JUnit テストを実行しようとすると、次のエラーが発生します。

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [javax.servlet.ServletContext] 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)}

SpringでServletContextのインジェクションは自動だと思っていたのですが…どうすれば解決できますか?

ありがとう!

編集: servletContext を使用して getRealPath() メソッドを呼び出したいです。代替手段はありますか?

4

3 に答える 3

27

ServletContextAwareインターフェースを実装すると、Spring がそれを注入します

@Controller
public class ServicesImpl implements Services, ServletContextAware{


private ServletContext context;

public void setServletContext(ServletContext servletContext) {
     this.context = servletContext;
}
于 2013-02-15T14:59:26.893 に答える
10

おそらく、単体テストで使用できるMockServletContextを見てみたいと思うでしょう。

于 2013-02-15T13:45:11.070 に答える
3

ServletContextはSpringBeanではないため、を実装しない限り注入できませんServletContextAware

モジュールまたはレイヤーで考える場合、サーブレットコンテキストはWebモジュール/レイヤーの外部で使用できないようにする必要があります。あなたのServicesImplフォームはビジネスまたはサービスレイヤーの一部だと思います。

あなたがもう少し文脈を与えれば、私たちはより良い代替案を提案することができるかもしれません。

于 2013-02-15T13:39:52.363 に答える