В Spring MVC, внутри класса Controller, метод, аннотированный аннотацией @RequestMapping
имеет возможность иметь Flexible Method Signature
.
Если я хочу сделать что-то подобное с помощью моей собственной custom annotation
, может ли кто-нибудь дать мне несколько указателей на то же самое.
Заранее спасибо.
Spring MVC имеет множество функций в этом отношении, поэтому было бы проще искать в другом месте в качестве отправной точки. Новая абстракция сообщений, которая была введена в Spring 4, имеет схожие функции.
Посмотрите на @MessageMapping
который позволяет вам создавать гибкую подпись против экземпляра Message
. Например, вы можете ввести заголовок сообщения
public void foo(@Header("myHeader") int myHeader)
Или вы можете подтвердить, что полезная нагрузка против Validator
public void bar(@Payload @Validated Order order)
Ядро инфраструктуры расположено в InvocableHandlerMethod
которое будет вызывать java.lang.reflect.Method
вы предоставили в данном экземпляре компонента, на основе входящего Message
и дополнительных параметров, которые вы можете предоставить (см. public final Object invoke(Message<?> message, Object... providedArgs)
Чтобы создать этот экземпляр, вам необходимо предоставить набор HandlerMethodArgumentResolver
. Каждый HandlerMethodArgumentResolver
отвечает за обработку параметра метода. Короче говоря, это в основном будет предоставлять вам экземпляр MethodParameter
(то есть ссылку на параметр метода, который вы хотите обработать, например аннотированный order
в последнем примере), и вы скажете, поддерживаете ли вы его или нет и когда вы это сделаете, обрабатывайте этот параметр так, чтобы вводилось правильное значение. Для примера заголовка реализация ищет заголовок с именем в аннотации. Просто!
Набор SimpAnnotationMethodMessageHandler
по умолчанию создается, например, в SimpAnnotationMethodMessageHandler
(смотрите initArgumentResolvers
). Это покажет вам параметры, которые вы можете ввести там по умолчанию. Расширяя этот список (или предоставляя настраиваемые экземпляры), вы можете увеличить то, что пользователь может использовать в сигнатуре метода.
Весной 4.1 мы полагаемся на эту инфраструктуру для предоставления аннотированных конечных точек прослушивателя JMS, и эти конечные точки также могут иметь гибкую подпись. На самом деле это уже реализовано, поэтому вы можете взглянуть на это еще на одном примере.