Estaba tratando de encontrarlo, pero encontré muchos escenarios diferentes, pero no este.
Lo que quiero hacer es agregar el prefijo "/api/" a todas las rutas en los controladores en com.myproject.api. Quiero "/api/*" para todos los controladores del paquete com.myapp.api y ningún prefijo para todos los controladores de com.myapp.web
¿Es posible con Spring/Spring Boot?
Si está utilizando Springboot, puede agregar lo siguiente:
server.servlet.context-path=/apial archivo application.properties.
Con Spring Boot, esto funcionó para mí:
@Configuration @EnableWebMvc public class WebMvcConfiguration implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.addPathPrefix("/api", HandlerTypePredicate.forBasePackage("com.your.package")); } }Logré el resultado que creo que está buscando de la siguiente manera, siempre que esté usando MVC.
Primero haga una clase de configuración que implemente WebMvcRegistrations
@Configuration public class WebMvcConfig implements WebMvcRegistrations { @Value("${Prop.Value.String}") //"api" private String apiPrefix; @Value("${Prop.Package.Names}") //["com.myapp.api","Others if you like"] private String[] prefixedPackages; @Override public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { return new PrefixedApiRequestHandler(apiPrefix,prefixedPackages); } } Luego, cree una clase que amplíe RequestMappingHandlerMapping y anule getMappingForMethod
@Log4j2 public class PrefixedApiRequestHandler extends RequestMappingHandlerMapping { private final String prefix; private final String[] prefixedPackages; public PrefixedApiRequestHandler(final String prefix, final String... packages) { super(); this.prefix = prefix; this.prefixedPackages = packages.clone(); } @Override protected RequestMappingInfo getMappingForMethod(final Method method, final Class<?> handlerType) { RequestMappingInfo info = super.getMappingForMethod(method, handlerType); if (info == null) { return null; } for (final String packageRef : prefixedPackages) { if (handlerType.getPackageName().contains(packageRef)) { info = createPrefixedApi().combine(info); log.trace("Updated Prefixed Mapping " + info); return info; } } log.trace("Skipped Non-Prefixed Mapping " + info); return info; } private RequestMappingInfo createPrefixedApi() { String[] patterns = new String[prefix.length()]; for (int i = 0; i < patterns.length; i++) { // Build the URL prefix patterns[i] = prefix; } return new RequestMappingInfo( new PatternsRequestCondition(patterns, getUrlPathHelper(), getPathMatcher(), useSuffixPatternMatch(), useTrailingSlashMatch(), getFileExtensions()), new RequestMethodsRequestCondition(), new ParamsRequestCondition(), new HeadersRequestCondition(), new ConsumesRequestCondition(), new ProducesRequestCondition(), null); } } Luego debería ver /api/(ControllerMapping) para todas las asignaciones, solo en los paquetes especificados. Nota: tengo @RequestMapping("/") en la parte superior de mi controlador.