Чтобы использовать разные пути для доступа к одному и тому же ресурсу в REST API - PullRequest
1 голос
/ 09 апреля 2020

Работа с Spring-boot: MVC, REST API

Фон: Модель = Студент >> Длинный возраст (один из атрибутов класса Студента)

Можно ли определить два URL пути доступа к возрасту конкретного ученика? Пример:

  1. Доступ по id студента

`

@GetMapping("/{id}/age")
public ResponseEntity<String> getStudentAge(@PathVariable Long id) {
    String age = studentService.retrieveAgeById(id);
    return new ResponseEntity<String>(age, HttpStatus.OK);
}

`

SQL запрос (с использованием идентификатора) :

@Query("select d.id, d.age from Student d where d.id=:id")
String findAgeById(Long id);
Возраст доступа по имени ученика

`

   @GetMapping("/{name}/age")
        public ResponseEntity<String>  getStudentAgeByName(@PathVariable String name) {
            String age = studentService.retrieveAgeByName(name);
            return new ResponseEntity<String>(age, HttpStatus.OK);
        }

`

SQL Запрос (с использованием имени):

@Query("select d.name, d.age from Student d where d.name=:name")
    String findAgeByName(String name);

Этот метод вызывает эту ошибку:

Произошла непредвиденная ошибка (тип = Внутренняя ошибка сервера, статус = 500). Методы неоднозначного обработчика, сопоставленные для '/ 2 / age': {public org.springframework.http.ResponseEntity com.example.restapi.controller.StudentController.getStudentAgeByName (java .lang.String), publi c orwork.sprf. http.ResponseEntity com.example.restapi.controller.StudentController.getStudentAge (java .lang.Long)}

1 Ответ

1 голос
/ 09 апреля 2020

Из-за /{name}/age и /{id}/age это один и тот же путь. Здесь {name} или {id} - это переменная пути.

Итак, вы пытаетесь отобразить два разных метода-обработчика с одним и тем же путем. Вот почему spring выдает ошибку Ambiguous handler methods mapped

Вы можете попробовать этот способ решить эту проблему

@GetMapping("/age/{id}")
public ResponseEntity<String> getStudentAge(@PathVariable Long id) {
    String age = studentService.retrieveAgeById(id);
    return new ResponseEntity<String>(age, HttpStatus.OK);
}

@GetMapping("/age/name/{name}")
public ResponseEntity<String>  getStudentAgeByName(@PathVariable String name) {
     String age = studentService.retrieveAgeByName(name);
     return new ResponseEntity<String>(age, HttpStatus.OK);
}

Но лучше использовать параметр запроса для поля без идентификатора, например name

...