1

次のように、No XML Spring @Configuration オブジェクトにオブジェクトを挿入する必要があります。

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "web.client")
public class WebApplicationConfiguration extends WebMvcConfigurerAdapter {

private static final Logger log = LoggerFactory.getLogger(WebApplicationConfiguration.class);

@Inject
private MonitoringExceptionResolver resolver;  // always null

@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
    log.debug("configuring exception resolvers");
    super.configureHandlerExceptionResolvers(exceptionResolvers);
    exceptionResolvers.add(new DefaultHandlerExceptionResolver());
    exceptionResolvers.add(new AnnotationMethodHandlerExceptionResolver());
    exceptionResolvers.add(new ResponseStatusExceptionResolver());
    exceptionResolvers.add(resolver);  // passing null ref here
}

}

MonitoringExceptionResolver は次のように定義されます。

@Service
public class MonitoringExceptionResolver implements HandlerExceptionResolver {

private final Counters counters;

@Inject
public MonitoringExceptionResolver(Counters counters) {
    super();
    this.counters = counters;
}

public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    Counter counter = counters.getCounterFor(ex.getClass());
    if(counter != null) {
        counter.increment();
    }
    return null;
}

}

ただし、@Autowired を使用しても、上記の「リゾルバー」フィールドが null であるため、実行チェーンの後半で NPE が発生します。

他のクラスは、コンポーネント スキャンを使用して別の場所に接続されています。上記で常に null になるのはなぜですか? 私は何か間違ったことをしていますか?

4

1 に答える 1

0

@Inject と @Autowired は、Spring で非常によく似た動作をするはずです。使用中の *BeanPostProcessor が MonitoringExceptionResolver を認識していることを確認してください。それを @Component としてマークし、make を @ComponentScan の対象にするか、@Bean ファクトリ メソッドを使用中の @Configuration クラスにします。

于 2012-10-16T16:28:03.537 に答える