Не могу понять, почему RepositoryRestController не работает?

#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, который вы используете для получения пользователем.