Разделение сопоставлений запросов для веб-запросов и запросов REST в Spring MVC

У меня есть веб-приложение Spring MVC. Теперь я хочу представить свой сервис как веб-сервис с помощью Spring REST. Для этого я хочу обрабатывать запросы Web и REST на основе значений URL. Ниже я попробовал то же самое с тремя контроллерами, MasterController, PatientController и PatientRESTController, показанными ниже. Методы были пропущены для краткости.

@Controller("/")
public class MasterController {

@RequestMapping("/web")
public ModelAndView webApplication(){
    return new ModelAndView("redirect:/web/patient");
}

@RequestMapping("/rest")
public ModelAndView webService(){
    return new ModelAndView("redirect:/rest/patient");
}
}

@Controller("/web/patient")
public class PatientController {

@GetMapping("")
public ModelAndView patientHome(){
    ModelAndView mv = new ModelAndView();
    mv.setViewName("patienthome");
    return mv;
}
}

@RestController("/rest/patient")
public class PatientRESTController {

@GetMapping("")
public List getAllPatientsREST(){
    return patientService.findAll();
}
}

При запуске веб-приложения я получаю ошибку:

Неоднозначное отображение. Не удается отобразить метод’/rest / patient’
public java.util.Список PatientRESTController.getAllPatientsREST()
to {[], methods=[GET]}: уже есть ‘/web/patient’ bean method

Как создать различные сопоставления url для REST и веб-приложения?

1 ответ

  1. Я думаю, что проблема исходит из пустой строки в @GetMapping("")
    Согласно вызванному исключению, это не относительное сопоставление, так как в обоих случаях разрешенное сопоставление Spring пусто для контроллеров rest :

    Неоднозначное отображение. Не удается отобразить’/rest / patient ‘ метод public
    Ява.util.Список PatientRESTController.getAllPatientsREST() в
    {[], methods=[GET]}: уже есть ‘/web/patient’ bean method

    Необходимо указать значение в примечании getMapping. Вы можете попробовать то или другое :

    @RestController
    public class PatientRESTController {
    
     @GetMapping("/rest/patients")
     public List getAllPatientsREST(){
        return patientService.findAll();
     }
    }
    

    Лично я бы заявил, что мне RestControllerэто нравится :

    @RestController
    @RequestMapping("/rest/patients")
    public class PatientRESTController {
    
      @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
        public ResponseEntity<?> getAll(HttpServletRequest request, HttpServletResponse response) {
         ...
        }
      }