Предоставить два метода для одной и той же конечной точки отдыха, но отличается от PathVariable в Spring - PullRequest
0 голосов
/ 23 мая 2018

У меня есть требование, в котором мне нужно сопоставить тело запроса с определенным дочерним классом на основе переменной пути.Тело запроса само по себе не содержит никакой информации о том, какой дочерний класс выбрать.

@ApiOperation(value = "Update Developer (dev)",
        response = ResponseEntity.class)
@RequestMapping(method = RequestMethod.PATCH,
        value = "/{type}")
public ResponseEntity<Response> updateDeveloper(
        @PathVariable String type,
        @RequestParam("year") String year,
        @RequestBody Developer employeeUpdate,

) { .....}


@ApiOperation(value = "Update Manager (manager)",
        response = ResponseEntity.class)
@RequestMapping(method = RequestMethod.PATCH,
        value = "/{type}")
public ResponseEntity<Response> updateManager(
        @PathVariable String type,
        @RequestParam("year") String year,
        @RequestBody Manager employeeUpdate,

) { .....}

Где Developer и Manager расширяют абстрактный класс Employee.

Я пытался использовать только один метод, подобныйниже:

@ApiOperation(value = "Update Employee (manager, dev)",
        response = ResponseEntity.class)
@RequestMapping(method = RequestMethod.PATCH,
        value = "/{type}")
public ResponseEntity<Response> updateEmployee(
        @PathVariable String type,
        @RequestParam("year") String year,
        @RequestBody Employee employeeUpdate,

) { .....}

Но Spring не может создать экземпляр экземпляра Employee в качестве абстрактного.

Мой дизайн неверен?Я предпочитаю иметь решение, которое не требует изменения классов Employee / Developer / Manager.

Заранее спасибо !!

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Спасибо всем за внимание.Я нашел способ, который подходит для моей ситуации:

@ApiOperation(value = "Update Developer (dev)",
        response = ResponseEntity.class)
@RequestMapping(method = RequestMethod.PATCH,
        value = "/{type:developer}")
public ResponseEntity<Response> updateDeveloper(
        @PathVariable String type,
        @RequestParam("year") String year,
        @RequestBody Developer employeeUpdate,

) { .....}

@ApiOperation(value = "Update Manager (manager)",
        response = ResponseEntity.class)
@RequestMapping(method = RequestMethod.PATCH,
        value = "/{type:manager}")
public ResponseEntity<Response> updateManager(
        @PathVariable String type,
        @RequestParam("year") String year,
        @RequestBody Manager employeeUpdate,

) { .....}

С этим я также не получу никакой ошибки инстанцирования, когда пытаюсь использовать один метод, а тип данных тела запроса устанавливается как родительский.

0 голосов
/ 23 мая 2018

В соответствии с требованиями REST вы должны идентифицировать свой ресурс:

@RequestMapping(method = RequestMethod.PATCH, value = "/developer")

@RequestMapping(method = RequestMethod.PATCH, value = "/manager")

Если вы все еще хотите разместить тело в произвольном порядке (который является либо разработчиком, либо менеджером), вы объединяете DTO менеджера и разработчика:

public class EmployeeDTO {
    private int type; // Developer or manager
    // All of properties of Manager and Developer
}

Проверяя type, вы можете делегировать правильный метод обслуживания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...