spring-mvc - @Value 在测试期间在@component 过滤器中不可见
问题描述
我创建了记录和保存所有请求的过滤器,这是其中的一部分:
@Component
public class RequestFilter extends OncePerRequestFilter {
@Value("${app.endpoint}")
private String requestMapping;
private final RequestRepository requestRepository;
@Autowired
public RequestFilter(RequestRepository requestRepository) {
this.requestRepository = requestRepository;
}
....
}
当应用程序运行requestMapping
时从spring上下文中正确读取,但是当我为该过滤器创建测试时 requestMapping 为空
@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2)
@ContextConfiguration(classes = {MyApplication.class})
@AutoConfigureMockMvc
@ActiveProfiles("test")
public class FilterTest {
@Autowired
private WebApplicationContext webApplicationContext;
@Autowired
private RequestRepository requestRepository;
@Autowired
protected MockMvc mockMvc;
@Before
public void setup() {
RequestFilter rpmRequestFilter = new RequestFilter(this.requestRepository);
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
.addFilter(invalidVpmRequestFilter)
.build();
}
}
当然,在 application-test.properties 我已经配置了这个属性:
app.endpoint=/log/save
有人知道问题出在哪里吗?为什么这在测试中不起作用?
解决方案
正如 M. Deinum 指出的那样,问题在于您正在创建一个实例,RequestFilter
如果您希望 Spring 在其中注入组件 ( @Autowired
) 或属性 ( @Value
),则必须让 Spring 按如下方式处理实例化:
@....
public class FilterTest {
....
@Autowired
RequestFilter requestFilter;
@Before
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
.addFilter(requestFilter)
.build();
}
}
推荐阅读
- java - 为什么在那之后我退出 Linux shell 中的 Spring Boot 应用程序(通过 CTRL+Z),一个进程仍在侦听 8080 端口?(我的应用程序使用的端口
- sql - 使用 TimescaleDB 获取每个组/聚合函数的最新/最新版本的版本化时间序列的有效方法
- qtableview - Quasar Q-Table 和数组中的数据(IndexedDB 和 Dexie)
- django - 如何通过 - 窗口函数过滤带注释的查询集 - 而不更改带注释字段的值
- python - python中的条件参数解析
- apexcharts - 如何添加工具提示选择的数据点的值以在 Apexcharts 中显示图例
- javascript - node.js 集群模块对我的想法没有帮助
- javascript - 在 React 中使用两个参数将状态从输入传递到开关
- python - 如何将字符串拆分为不同的单词
- webpack - Webpack - 如何获取块的模块