我正在尝试使用@ControllerAdvice类内的@InitBinder批注方法注册全局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 BINDER”打印到System.out。
这意味着自定义编辑器不会被注册,因此它们将无法工作。
如果我将initBinder方法复制并粘贴到我的一个Controller中,则对于该特定Controller来说就可以正常工作。

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


有什么想法吗?

最佳答案

因此,对于遇到此问题的任何人……这是我为解决此问题所做的工作。

而不是

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


在我的root-context.xml中

我将其更改为我的配置包

<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>

关于java - Spring 4 ControllerAdvice和InitBinder,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21922646/

10-10 06:46