0

コンテキスト階層を持つ Web アプリケーションがあります

a) コントローラを除外するスキャンを伴うアプリケーション コンテキスト:

<context:component-scan base-package="com.mypackage">
        <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation" />
    </context:component-scan>

b) controller を含む mvc コンテキスト:

<context:component-scan base-package="com.mypackage"
        use-default-filters="false">
        <context:include-filter expression="org.springframework.stereotype.Controller"
            type="annotation" />
    </context:component-scan>

私はこのbeanPostProcessorを「書いた」(自動的にロガーを設定する)

@Component
public class LoggableInjector implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
        ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() {
            public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
                ReflectionUtils.makeAccessible(field);
                if (field.getAnnotation(Loggable.class) != null) {
                    Logger log = LoggerFactory.getLogger(bean.getClass());
                    field.set(bean, log);
                }
            }
        });
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
        ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() {
            public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
                ReflectionUtils.makeAccessible(field);
                if (field.getAnnotation(Loggable.class) != null) {
                    Logger log = LoggerFactory.getLogger(bean.getClass());
                    field.set(bean, log);
                }
            }
        });
        return bean;
    }

}

問題は、このプロセッサが @Controller クラスに対して呼び出されないことです。これは、独自のコンテキストでのみ Bean を処理するためです。

mvc コンテキストにある Bean (@Controller) を処理するにはどうすればよいですか?

ありがとう !

4

1 に答える 1

1

https://jira.spring.io/browse/SPR-8331

これがSpringが明示的に言っていることです。

PostProcessor は、PostProcessor 自体が属するコンテキストでのみ Bean を処理でき、階層コンテキストからは処理できません。

私の頭に浮かぶ唯一の方法は、ロードするすべてのコンテキストに PostProcessor を追加することです。

于 2015-10-23T00:54:35.963 に答える