У меня есть следующий контроллер (обратите внимание, как он настроен):
@Controller
public class MyController {
@Autowired
private RequestMappingHandlerMapping requestMappingHandlerMapping;
@PostConstruct
private void createRequestMapping() throws Exception {
RequestMappingInfo commandExecutionRequestMappingInfo =
RequestMappingInfo
.paths(endpointUri)
.methods(RequestMethod.POST)
.consumes(MediaType.APPLICATION_JSON_VALUE)
.produces(MediaType.APPLICATION_JSON_VALUE)
.build();
requestMappingHandlerMapping
.registerMapping(commandExecutionRequestMappingInfo, this,
MyController.class.getDeclaredMethod("execute", String.class));
RequestMappingInfo getAvailableCommandsRequestMappingInfo =
RequestMappingInfo
.paths(endpointUri)
.methods(RequestMethod.GET)
.build();
requestMappingHandlerMapping
.registerMapping(getAvailableCommandsRequestMappingInfo, this,
MyController.class
.getDeclaredMethod("getAvailableCommands", Model.class));
}
@ResponseBody
private String execute(@RequestBody String command) {
...
}
private String getAvailableCommands(Model model) {
model.addAttribute("docs", handlerDocs);
return "docs";
}
Существует страница docs.html
, которая находится в main/resources/templates/docs.html
.
Когда я запускаю тест с MockMvc, он видит вывод этой страницы:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class ApplicationConfig {
}
Вот тестовый класс:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ApplicationConfig.class)
@AutoConfigureMockMvc
public class SpringRestCommanderTest {
@Autowired
private MockMvc mvc;
@Test
public void testGetAvailableCommands() throws Exception {
mvc.perform(get("/execute")).andDo(print());
}
}
Однако, когда я запускаю ту же самую вещь в реальном приложении, она дает мне 404 для запроса GET, когда я пытаюсь сделать это в браузере.
Что странно, это то же самое /execute
работает при выдаче ему запроса POST. Как вы можете видеть выше, динамическое отображение очень похоже между POST и GET.
Что я здесь не так делаю?