В соответствии с методикой, описанной в Изменение @RequestMappings при запуске ,
да, можно создать шаблон URL из суперклассов так, как вы хотите.
По сути, вы должны создать подкласс RequestMappingHandlerMapping (скорее всего, это будет ваша реализация HandlerMapping , но сначала проверьте ее)
и переопределить защищенный метод getMappingForMethod
.
Как только это станет возможным, вы полностью контролируете генерацию шаблона URL.
Из приведенного вами примера не совсем ясно, какая именно политика слияния, например, какой путь вы хотите использовать, если
суперкласс AbstractTwitterController
также реализует метод updateStatus()
со своим собственным @RequestMapping
, или как вы хотите объединить шаблоны URL по иерархии сверху вниз или снизу вверх (я предположил первый ниже),
но, надеюсь, следующий фрагмент даст вам некоторые идеи:
private static class PathTweakingRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
RequestMappingInfo methodMapping = super.getMappingForMethod(method, handlerType);
if (methodMapping == null)
return null;
List<String> superclassUrlPatterns = new ArrayList<String>();
boolean springPath = false;
for (Class<?> clazz = handlerType; clazz != Object.class; clazz = clazz.getSuperclass())
if (clazz.isAnnotationPresent(RequestMapping.class))
if (springPath)
superclassUrlPatterns.add(clazz.getAnnotation(RequestMapping.class).value()[0]);// TODO handle other elements in the array if necessary
else
springPath = true;
if (!superclassUrlPatterns.isEmpty()) {
RequestMappingInfo superclassRequestMappingInfo = new RequestMappingInfo("",
new PatternsRequestCondition(String.join("", superclassUrlPatterns)), null, null, null, null, null, null);// TODO implement specific method, consumes, produces, etc depending on your merging policies
return superclassRequestMappingInfo.combine(methodMapping);
} else
return methodMapping;
}
}
Еще один хороший вопрос - как перехватить создание экземпляра RequestMappingHandlerMapping
. В Интернете существует множество различных примеров различных стратегий конфигурации.
Однако с JavaConfig помните, что если вы укажете WebMvcConfigurationSupport
в вашем наборе @Configuration
, тогда ваш @EnableWebMvc
(явный или неявный) перестанет работать. Я закончил со следующим:
@Configuration
public class WebConfig extends DelegatingWebMvcConfiguration{
@Configuration
public static class UnconditionalWebMvcAutoConfiguration extends WebMvcAutoConfiguration {//forces @EnableWebMvc
}
@Override
protected RequestMappingHandlerMapping createRequestMappingHandlerMapping() {
return new PathTweakingRequestMappingHandlerMapping();
}
@Bean
@Primary
@Override
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
return super.requestMappingHandlerMapping();
}
}
но хотел бы узнать о лучших путях.