2014-02-21 72 views
2

我想在@ControllerAdvice類中使用@InitBinder批註的方法註冊全局InitBinder。Spring 4 ControllerAdvice和InitBinder

package com.myapp.spring.configuration; 

import org.springframework.web.bind.WebDataBinder; 
import org.springframework.web.bind.annotation.ControllerAdvice; 
import org.springframework.web.bind.annotation.InitBinder; 
import org.springframework.web.context.request.WebRequest; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 

@ControllerAdvice 
@EnableWebMvc 
public class CustomInitBinder { 

    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     System.out.println("INIT BINDER"); 
     binder.registerCustomEditor(java.sql.Date.class, new SqlDatePropertyEditor()); 
     binder.registerCustomEditor(java.sql.Timestamp.class, new SqlTimestampPropertyEditor()); 
    } 

} 

我遇到的問題是,我看到它時加載尋找@InitBinder,但它從來沒有真正進入,因爲我沒有得到「INIT粘合劑」打印到System.out的方法。 這意味着自定義編輯器沒有獲得註冊,因此它們不起作用。 如果我將initBinder方法複製並粘貼到其中一個控制器中,它對那個特定控制器來說工作得很好。

1989 INFO [ContainerBackgroundProcessor[StandardEngine[Catalina]]] (RequestMappingHandlerAdapter.java:636) - Detected @InitBinder methods in customInitBinder 

任何想法是怎麼回事?

+0

只是想知道如果你真的可以混合ControllerAdvice和EnableWebMvc? –

+0

我不記得我在哪裏看到別人正在做同樣的事情 - 但刪除它似乎沒有什麼區別。 – Paul

+0

這很可能是一個類掃描問題。 ControllerAdvice必須在與控制器相同的ApplicationContext中加載。由於你的建議是在一個配置包中,你確定它是在春天初始化爲servlect-context? –

回答

2

因此,對於任何人遇到這個問題......這是我所做的解決它。

代替在我的根的context.xml具有

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

我改變這對我的配置包

<context:component-scan base-package="com.myapp.spring.configuration"></context:component-scan> 

然後我移動@ControllerAdvice註解的類到COM。 myapp.spring.controllers,並在servlet-context.xml中添加

<context:component-scan base-package="com.myapp.spring.controllers"> 
    <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/> 
</context:component-scan>