Spring: Могу ли я абстрагировать свои сопоставления запросов от базового класса? - PullRequest
1 голос
/ 09 мая 2020

Приложение My Spring Boot имеет набор классов контроллеров REST, каждый из которых выполняет более или менее одинаковые стандартные операции CRUD на своих соответствующих моделях, только с разными именами конечных точек (одно - /user, другое - /group, et c). Имеет смысл упаковать это поведение в базовый класс, который, возможно, называется Controller.

Во-первых, есть ли уже такой базовый класс в Spring, который я пропустил? Кажется, это удобное поведение, которое может понадобиться многим, поэтому я удивлен, что не могу его найти.

Если нет, и мне нужно написать это самому, моя проблема: что мне делать с аннотации сопоставления запросов, например @GetMapping и @PostMapping? Их аргумент value должен быть постоянным, поэтому я не могу просто использовать аннотации в суперклассе и вставлять в них каждое имя конечной точки, как в @GetMapping("/" + endpointName + "/{id}"). Могу ли я написать свои методы обработки запросов без аннотаций, а затем обернуть и аннотировать их в каждом из моих 5-6 подклассов, как это?

@RestController
public abstract class Controller<T> {

    public ResponseEntity<T> create(T obj) {
        // Creation behaviour
    }

    // Same for retrieve, update, etc

}

...

public class UserController extends Controller<User> {

    @Override
    @PostMapping("/user")
    public ResponseEntity<User> create(@RequestBody User user) {
        return super.create(user);
    }

    // Repeat for other operations

}

// and repeat for all the other subclasses

Это кажется немного избыточным; Я был бы рад, если бы был способ чище.

1 Ответ

1 голос
/ 09 мая 2020

Вы можете создать общий c абстрактный контроллер для ваших сопоставлений CRUD, например:

public abstract class AbstractGenericController<E extends yourGenericEntity> {
private static final Logger LOG = LoggerFactory.getLogger(AbstractGenericController.class);
@RequestMapping(value = "/create", method = RequestMethod.POST)
public ResponseEntity<GenericResult<T>> create(@RequestBody String input) {
// your process
}
@RequestMapping(value = "/update", method = RequestMethod.POST)
public ResponseEntity<GenericResult<T>> update(@RequestBody String input) {
// your process
}

Тогда ваш контроллер расширит абстрактный контроллер.

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