1

我正在编写我的第一个 spring-boot 应用程序,所以我相信我的某个配置问题导致了我的错误。

我有一个类“MyInterceptor”,它用“@Component”注释并扩展了 HandlerInterceptorAdapter。

@Component
public class MyInterceptor extends HandlerInterceptorAdapter { ... }

我有一个用“@Configuration”注释的配置类“WebConfiguration”(并且没有用“@EnableWebMvc”注释)。

我在 WebConfiguration 中声明/注入我的拦截器类,如下所示:

@Resource
private MyInterceptor myInterceptor;

然后将此类指定为拦截器,如下所示:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(myInterceptor);
}

在 MyInterceptor 中,我声明了一个要为其注入值的属性。我已将其声明为默认值,如下所示:

@Value("${my.interceptor.property:default_value}")
private String myInterceptorProperty;

当我像上面那样在@Value 注释中声明“default_value”时,始终使用该值。我的 application-dev.yml 文件中声明的值被忽略。

当我删除默认值时,将使用我的 application-dev.yml 中的值。

我怀疑 @Value 注释中的默认值是在配置值之后加载并出于某种原因覆盖它。但我不知道为什么或如何阻止它。

我的应用程序中使用 @Value 注释但未在我的 WebConfiguration 中声明/注入的其他服务没有表现出相同的行为。

我尝试像这样添加我的拦截器:

@Bean
public MyInterceptor getMyInterceptor() {
    return new MyInterceptor();
}

然后改变了这个:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(getMyInterceptor());
}

但是当我这样做时,无论我是否声明了默认值,都不会获取 application-dev.yml 中的配置值。

我确实理解为什么 @Resource 注释注入使我配置的属性可用,以及为什么 Config 类中的直接构造函数调用不可用。但是使用 @Resource 注释是错误的方法吗?为什么我的默认设置没有被覆盖?

我应该如何将配置值注入到我的拦截器和在我的 Config 类中类似声明的其他类中?

4

0 回答 0