我创建了一个 MessageSourceConfig,如下所示:
@Configuration
public class MessageSourceConfig {
@Value("${spring.messages.basename}")
private String[] basenames;
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames(basenames);
messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
return messageSource;
}
}
以及像 TodoController 这样的典型控制器:
@RestController
@RequestMapping("api/v1/todos")
@RequiredArgsConstructor
public class TodoController {
private final GetTodosUseCaseHandler getTodosUseCaseHandler;
@GetMapping("all")
public ResponseEntity<List<TodoResponseDto>> getAllTodos() {
List<TodoAggregate> todos = getTodosUseCaseHandler.handle();
return ResponseEntity.ok(TodoMapper.INSTANCE.aggregateListToTodoResponseDtoList(todos));
}
}
最后使用 WebMvcTest 创建了一个 ControllerTest:
@WebMvcTest(controllers = TodoController.class)
@ContextConfiguration(classes = {MessageSourceConfig.class, TodoController.class},
initializers = ConfigDataApplicationContextInitializer.class)
class TodoControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@MockBean
private GetTodosUseCaseHandler getTodosUseCaseHandler;
@MockBean
private CreateTodoUseCaseHandler createTodoUseCaseHandler;
private static final Long TODO_ID_1 = 1L;
@Test
void getAllTodos_success() throws Exception {
List<TodoAggregate> results = List.of(createAggregate());
when(getTodosUseCaseHandler.handle()).thenReturn(results);
mockMvc.perform(get("/api/v1/todos/all"))
.andExpect(status().isOk())
.andExpect(jsonPath("$").isArray())
.andExpect(jsonPath("$.[0].id", is(TODO_ID_1.intValue())))
.andExpect(jsonPath("$", hasSize(1)));
verify(getTodosUseCaseHandler).handle();
}
}
在测试我的应用程序时,当我尝试访问 messageSource -> basenames 参数无法正常工作。基本名称返回类似
${spring.messages.basename}
有什么建议吗?
spring.messages.basename=messages
${spring.messages.basename}
的扩展输出是messages
,但它是${spring.messages.basename}
有趣,但
@Value
不适用于这种情况。找到两种不同的解决方案:
解决方案一:(使用环境)
@Configuration
@RequiredArgsConstructor
public class MessageSourceConfig {
private final Environment environment;
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
String[] basenames = environment.getProperty("spring.messages.basename", String[].class);
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames(basenames);
messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
return messageSource;
}
}
解决方案2:(使用
@ConfigurationProperties
)
@Configuration
@RequiredArgsConstructor
public class MessageSourceConfig {
@Bean
@ConfigurationProperties(
prefix = "spring.messages"
)
public MessageSourceProperties sourceProperties() {
return new MessageSourceProperties();
}
@Bean
public ReloadableResourceBundleMessageSource messageSource(MessageSourceProperties sourceProperties) {
String[] basenames = StringUtils.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(sourceProperties.getBasename()));
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames(basenames);
messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
return messageSource;
}
}