2015-10-15 2 views
3

В приложении 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); 
    } 
} 

ответ

1

Вы можете использовать @ControllerAdvice. Все, что здесь определено, применимо ко всем контроллерам или определенному подмножеству, если вы этого предпочтете.

Documentation

Другой вариант (лучше имхо), чтобы написать message converter. Он обрабатывает только один конкретный тип. Вам больше не нужно @ModelAttribute, но у вас есть параметр TableRequest в вашем методе контроллера.

+0

Я попытался положить метод ModelAttribute в классе ControllerAdvice но что вызвало все другие контроллеры сломать, потому что он пытался разобрать TableRequest Params, даже на контроллерах который не использовал его. Есть ли способ указать, что ModelAttribute применяется только к RequestParameters данного типа? – pedorro

+0

Чтение и мышление немного больше, возможно, правильная вещь - создать интерфейс «TableRequestController» и нацелить ControllerAdvice на это: – pedorro

+0

@pedorro Я добавил альтернативное решение. – zeroflagL

0

В приложении SpringBoot REST У меня есть тип TableRequest, что содержит сортировку столбца, фильтрацию и деталь для поискового вызова GET запросов для табличных данных.Это общее в том, что это не важно, что конкретные данные запрашиваются, оно определяет только общие параметры таблицы

Это означает, что у вас есть утилита обслуживания.

Таким образом, определите класс как сервис и получите доступ к нему внутри представлений.

Доступ любые бобы в контексте приложения, используя синтаксис SpringEL в: ${@myBean.doSomething()}