Я использую Spring Data Rest и не могу понять, почему мой RepositoryRestController не работает. Его код:
@RepositoryRestController
public class Cntrl {
@Autowired
private UserDao userDao;
@RequestMapping(name = "/users/{id}/nameOne",method =
RequestMethod.GET)
@ResponseBody
public PersistentEntityResource setNameOne(@PathVariable("id") Long id, PersistentEntityResourceAssembler persistentEntityResourceAssembler){
User user = userDao.findById(id).orElseThrow(()->{
throw new ServerException("Wrong id");
});
user.setLogin("One");
userDao.save(user);
return persistentEntityResourceAssembler.toFullResource(user);
}
}
И стартовый класс Spring Boot:
@SpringBootApplication
@EnableWebMvc
@EnableScheduling
@EnableJpaRepositories
@EnableSpringDataWebSupport
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
Когда я перехожу к базовому пути (localhost:8080/api), все в порядке, но когда я отправляю GET на запрос к localhost:8080/api/users/1/nameOne, я получаю пустой ответ, у меня нет других контроллеров, и у меня есть пользователь с id 1, так почему он не работает?
ничего, сервер не реагирует на запрос




Если localhost:8080/api является вашим корневым контекстом, то localhost:8080/api/users/1/nameOne должен быть URL-адресом, который вы используете для пользователя GET.
Это не работает, потому что структура URL, которую вы используете, уже имеет значение в контексте Spring Data Rest.
/{repository}/{id}/{column} URL-адрес обрабатывается методом RepositoryPropertyReferenceController.followPropertyReference.
/api/users/1/nameOne означает: получить столбец nameOne пользователя с идентификатором 1. Важное примечание: этот столбец должен ссылаться на другой @Entity. Это означает, что если у вас есть столбец String с именем «фамилия», и вы нажмете URL-адрес /api/users/1/name, вы получите 404, потому что этот столбец не ссылается на другой объект. Если у вас есть столбец с именем школа, который ссылается на объект School, и вы нажмете URL-адрес /api/users/1/school, вы получите указанный объект школы для этого пользователя. Если у пользователя нет школы, вы снова получите 404.
Кроме того, @RepositoryRestController можно использовать для @RequestMapping, если указанный вами URL-адрес не конфликтует с Spring Data Rest.
Вы можете проверить это на следующем примере:
@RepositoryRestController
public class CustomRepositoryRestController {
@RequestMapping(path = "/repositoryRestControllerTest", method = RequestMethod.GET)
@ResponseBody
public String nameOne() {
return "test";
}
}
Посетите http://localhost:8080/repositoryRestControllerTest
Я надеюсь, что это объяснение прояснит для вас ситуацию.
Да, ты прав! Я понял это несколько дней назад, но забыл написать ответ на этот вопрос! В любом случае, спасибо !
Есть информация в лог-файлах сервера?