В приложении REST RESTBUT у меня есть тип TableRequest
, который содержит сортировку, фильтрацию и детализирование столбцов для запросов GET для табличных данных. Это типично в том, что ему все равно, какие конкретные данные запрашиваются, он задает только общие параметры таблицы. Таким образом, это применимо к множеству различных методов контроллера. Кроме того, поскольку он применяется к запросам GET, поля передаются как параметры запроса (no json parameter). У меня есть метод @ModelAttribute
внутри класса контроллера, который анализирует параметры запроса в объекте TableRequest
, тогда фактический метод @RequestMapping
принимает этот объект как параметр @ModelAttribute
.Применить Spring ModelAttribute ко всем контроллерам, использующим определенный тип параметра
Поскольку класс TableRequest
является общим, я хотел бы иметь возможность использовать его на нескольких контроллерах без необходимости копировать логику синтаксического анализа в каждый. Мне интересно, есть ли способ, основанный на комментариях Spring-y, повторно использовать один и тот же метод @ModelAttribute
в любое время, когда контроллер имеет входной параметр TableRequest
.
Заранее спасибо :)
Мое решение (на основе выбранного ответа ниже)
Я создал @TableRequestController
аннотацию и соответствующий @ControllerAdvice
класс, который относится только к классам контроллеров, которые имеют что аннотаций. Этот класс ControllerAdvice включает метод @ModelAttribute
, который tht анализирует параметры запроса GET в объект TableRequest
.
Важным моментом здесь является то, что новый @TableRequestController
может применяться только к классу Controller в целом, а не к отдельным методам контроллера. Таким образом, я создал отдельный внутренний класс контроллера, помеченный этой аннотацией, методы @RequestMapping все принимают объект TableRequest.
@TableRequestController:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface TableRequestController {}
ControllerAdvice класс:
@ControllerAdvice(annotations = TableRequestController.class)
public class TableRequestControllerAdvice {
@ModelAttribute
public TableRequest tableRequest(
@RequestParam Map<String, String> params,
@RequestParam int pageStart,
@RequestParam int pageSize) {
return new TableRequest(params, pageStart, pageSize);
}
}
TableRequest класс контроллера REST:
@RestController
@TableRequestController
public static class MyTableRequestController {
@RequestMapping("/the/table/request/url")
public MyResponse makeTableRequest(
TableRequest tableRequest) {
return new MyResponse(tableRequest);
}
}
Я попытался положить метод ModelAttribute в классе ControllerAdvice но что вызвало все другие контроллеры сломать, потому что он пытался разобрать TableRequest Params, даже на контроллерах который не использовал его. Есть ли способ указать, что ModelAttribute применяется только к RequestParameters данного типа? – pedorro
Чтение и мышление немного больше, возможно, правильная вещь - создать интерфейс «TableRequestController» и нацелить ControllerAdvice на это: – pedorro
@pedorro Я добавил альтернативное решение. – zeroflagL