2012-01-23 34 views
0

私は、注釈を使用してDefaultAnnotationHandlerMappingをオーバーライドするspring mvcハンドラインターセプタを実装するための指示hereに従っています。DefaultAnnotationHandlerMappingが呼び出されないのはなぜですか?

ただし、インターセプタは呼び出されません。

私はここで間違っているのを誰も見ることができますか?

ブログ記事のように@Interceptorsを実装しました。

私が作成した1インターセプター:

@Component 
public class InterceptorSpike extends HandlerInterceptorAdapter { 

    public InterceptorSpike() { 
     System.err.println("InterceptorSpike initialised"); 
    } 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
     throw new RuntimeException("Yay, intercepted!"); 
    } 
} 

とテストコントローラ:

@Controller 
@Interceptors({InterceptorSpike.class}) 
public class TestController { 

    @RequestMapping(value = "/test", method = RequestMethod.GET) 
    public void doSomething() { 
     System.err.println("I'm doing something, have I been intercepted??"); 
    } 
} 

(ブログ記事など、ほとんど同じ)私のハンドラのサンプル

@Component 
public class HandlerInterceptorAnnotationAwareHandlerMapping extends DefaultAnnotationHandlerMapping { 

    public HandlerInterceptorAnnotationAwareHandlerMapping() { 
     System.err.println("HandlerInterceptorAnnotationAwareHandlerMapping initialised"); 
    } 
... 

[編集 - 無視、完全のために残しました。 元々@Componentを使ってこれをautowiredしましたが、私は別の修正を試みていたので、これをアプリコンテキストに移しました。
注文を追加しましたが、<mvc:annotation-driven/>を使用していません。これらは私が解決策を探している間にいくつかの投稿によって示唆されました。 [/ EDIT]

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" 
     default-autowire="byName"> 

<context:component-scan base-package="com.xxx"/> 
<context:spring-configured/> 

<!-- removed manual wiring --> 

</beans> 

そして最後に、ここに私のテストです:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"/test-app-context.xml"}) 
public class ControllerInterceptorTest { 

    @Autowired 
    private ApplicationContext applicationContext; 

    @Autowired 
    private TestController controller; 

    @Test 
    public void shouldInterceptMethod() { 
     Map<String, DefaultAnnotationHandlerMapping> mappings = applicationContext.getBeansOfType(DefaultAnnotationHandlerMapping.class); 
     for (String key : mappings.keySet()) { 
      DefaultAnnotationHandlerMapping mapping = mappings.get(key); 
      System.out.println(String.format("key [%s], order [%s], value = %s", key, mapping.getOrder(), mapping.getClass().getCanonicalName())); 
     } 
     controller.doSomething(); 
     fail("should have thrown exception"); 
    } 
} 

私はこの出力を得る:私の新しいDefaultAnnotationHandlerMappingに

HandlerInterceptorAnnotationAwareHandlerMapping initialised 
InterceptorSpike initialised 
key [handlerInterceptorAnnotationAwareHandlerMapping], order [2147483647], value = com.xxx.interceptors.HandlerInterceptorAnnotationAwareHandlerMapping 
I'm doing something, have I been intercepted?? 
java.lang.AssertionError: should have thrown exception 
    at org.junit.Assert.fail(Assert.java:91) 
... 

getHandlerExecutionChainが呼び出されることはありません。

これまで読んでいただきありがとうございます - 私はここにたくさんあることを知っています!

誰かが私が見逃した、または間違ったことを見ることができますか?

ありがとうございます!

答えて

4

問題は、このラインで次のようになります。

private TestController controller = new TestController(); 

あなたが文脈から「コントローラハンドル」を取得し、自分自身を初期化しないようにする必要があります。

+0

ありがとうございます - 私はそれが問題だったでしょう。残念ながら、私のコードを上記のように更新した後も、私はまだ傍受を受けていません。 – laura

+0

これについてもっと考えると、コントローラに実際に要求を受け取るサーブレット環境でこれが機能するはずです。あなたのコードをデプロイして、インターセプタが起動しているかどうかを確認しましたか? – Abhi

関連する問題