#java #spring #spring-data-rest
#java #весна #spring-data-rest
Вопрос:
Я использую 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 я получаю пустой ответ, у меня нет других контроллеров, и у меня есть пользователь с идентификатором 1, так почему он не работает?
Комментарии:
1. Любая информация в файлах журнала сервера?
2. ничего, сервер не реагирует на запрос
Ответ №1:
Это не работает, потому что используемая вами структура 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, который ссылается на School
объект, и вы нажмете URL /api/users/1/school
, вы получите объект 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
Я надеюсь, что это объяснение прояснит для вас ситуацию.
Комментарии:
1. Да, вы правы! Я понял это несколько дней назад, но забыл написать ответ на этот вопрос! В любом случае, спасибо!
Ответ №2:
Если localhost:8080/api
это ваш корневой контекст, то localhost:8080/api/users/1/nameOne
должен быть URL, который вы используете для получения пользователем.