스프링 부트에서 휴식을 위해 기본 URL을 설정하는 방법은 무엇입니까?
단일 스프링 부트 프로젝트에서 mvc와 휴식을 혼합하려고합니다.
난과 주석을 각 컨트롤러 싶지 않아 (모든 나머지 컨트롤러 (예. example.com/api) 하나의 장소에 대한 설정 기본 경로에 원하는 @RequestMapping('api/products')
대신에, 단지를 @RequestMapping('/products')
.
Mvc 컨트롤러는 example.com/whatever에서 액세스 할 수 있어야합니다.
가능할까요?
(나는 spring data rest를 사용하지 않고 spring mvc 만 사용합니다)
Spring Boot 1.2 이상에서는 application.properties의 단일 속성 만 있으면됩니다.
spring.data.rest.basePath=/api
조금 늦었지만 같은 질문이 답변에 도달하기 전에 여기로 왔으므로 여기에 게시합니다. application.properties를 만들고 (아직 가지고 있지 않은 경우) 추가합니다.
server.contextPath=/api
따라서 이전 예제에서 RestController가 @RequestMapping("/test")
있으면 다음과 같이 액세스합니다.localhost:8080/api/test/{your_rest_method}
질문 출처 : 스프링 부트 웹 앱의 URL을 어떻게 선택합니까?
스프링 부트 프레임 워크 버전 2.0.4.RELEASE+
. 이 줄 추가application.properties
server.servlet.context-path=/api
이것이 문제에 대한 첫 번째 Google 히트이므로 더 많은 사람들이 이것을 검색 할 것이라고 가정합니다. Spring Boot '1.4.0'이후 새로운 옵션이 있습니다. 이제 @RestController로 주석이 달린 클래스에 대해 다른 경로를 정의 할 수 있는 사용자 정의 RequestMappingHandlerMapping 을 정의 할 수 있습니다.
@RestController 와 @RequestMapping 을 결합하는 사용자 지정 주석이있는 다른 버전 은이 블로그 게시물 에서 찾을 수 있습니다.
@Configuration
public class WebConfig {
@Bean
public WebMvcRegistrationsAdapter webMvcRegistrationsHandlerMapping() {
return new WebMvcRegistrationsAdapter() {
@Override
public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
return new RequestMappingHandlerMapping() {
private final static String API_BASE_PATH = "api";
@Override
protected void registerHandlerMethod(Object handler, Method method, RequestMappingInfo mapping) {
Class<?> beanType = method.getDeclaringClass();
if (AnnotationUtils.findAnnotation(beanType, RestController.class) != null) {
PatternsRequestCondition apiPattern = new PatternsRequestCondition(API_BASE_PATH)
.combine(mapping.getPatternsCondition());
mapping = new RequestMappingInfo(mapping.getName(), apiPattern,
mapping.getMethodsCondition(), mapping.getParamsCondition(),
mapping.getHeadersCondition(), mapping.getConsumesCondition(),
mapping.getProducesCondition(), mapping.getCustomCondition());
}
super.registerHandlerMethod(handler, method, mapping);
}
};
}
};
}
}
이 간단한 질문에 대한 답이 얼마나 복잡한 지 믿을 수 없었습니다. 다음은 몇 가지 참고 자료입니다.
고려해야 할 여러 가지 사항이 있습니다.
server.context-path=/api
에서 설정application.properties
하면 모든 것에 대한 접두사를 구성 할 수 있습니다 . (server.contextPath가 아닌 server.context-path!)- 저장소를 나머지 끝점으로 노출하는 @RepositoryRestController 주석이 달린 SpringData 컨트롤러
spring.data.rest.base-path
는application.properties
. 그러나 평범한@RestController
것은 이것을 고려하지 않을 것입니다. 스프링 데이터 나머지 문서 에 따르면이를 위해@BasePathAwareController
사용할 수 있는 주석 이 있습니다. 그러나 그러한 컨트롤러를 보호하려고 할 때 Spring-security와 관련하여 문제가 있습니다. 더 이상 찾을 수 없습니다.
또 다른 해결 방법은 간단한 트릭입니다. 주석에서 정적 문자열을 접두사로 사용할 수는 없지만 다음과 같은 표현식을 사용할 수 있습니다.
@RestController
public class PingController {
/**
* Simple is alive test
* @return <pre>{"Hello":"World"}</pre>
*/
@RequestMapping("${spring.data.rest.base-path}/_ping")
public String isAlive() {
return "{\"Hello\":\"World\"}";
}
}
Boot 2.0.0+의 경우 이것은 나를 위해 작동합니다 : server.servlet.context-path = / api
나머지 컨트롤러에만 영향을 미치는 깨끗한 솔루션을 찾았습니다.
@SpringBootApplication
public class WebApp extends SpringBootServletInitializer {
@Autowired
private ApplicationContext context;
@Bean
public ServletRegistrationBean restApi() {
XmlWebApplicationContext applicationContext = new XmlWebApplicationContext();
applicationContext.setParent(context);
applicationContext.setConfigLocation("classpath:/META-INF/rest.xml");
DispatcherServlet dispatcherServlet = new DispatcherServlet();
dispatcherServlet.setApplicationContext(applicationContext);
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(dispatcherServlet, "/rest/*");
servletRegistrationBean.setName("restApi");
return servletRegistrationBean;
}
static public void main(String[] args) throws Exception {
SpringApplication.run(WebApp.class,args);
}
}
Spring boot will register two dispatcher servlets - default dispatcherServlet
for controllers, and restApi
dispatcher for @RestControllers
defined in rest.xml
:
2016-06-07 09:06:16.205 INFO 17270 --- [ main] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'restApi' to [/rest/*]
2016-06-07 09:06:16.206 INFO 17270 --- [ main] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
The example rest.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="org.example.web.rest"/>
<mvc:annotation-driven/>
<!-- Configure to plugin JSON as request and response in method handler -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonMessageConverter"/>
</list>
</property>
</bean>
<!-- Configure bean to convert JSON to POJO and vice versa -->
<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</bean>
</beans>
But, you're not limited to:
- use
XmlWebApplicationContext
, you may use any else context type available, ie.AnnotationConfigWebApplicationContext
,GenericWebApplicationContext
,GroovyWebApplicationContext
, ... - define
jsonMessageConverter
,messageConverters
beans in rest context, they may be defined in parent context
I might be a bit late, BUT... I believe it is the best solution. Set it up in your application.yml (or analogical config file):
spring:
data:
rest:
basePath: /api
As I can remember that's it - all of your repositories will be exposed beneath this URI.
You can create a custom annotation for your controllers:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@RestController
@RequestMapping("/test")
public @interface MyRestController {
}
Use it instead of the usual @RestController on your controller classes and annotate methods with @RequestMapping.
Just tested - works in Spring 4.2!
You can create a base class with @RequestMapping("rest")
annotations and extend all you other classes with this base class.
@RequestMapping("rest")
public abstract class BaseController {}
Now all classes that extend this base class will be accessible at rest/**
.
With spring-boot 2.x you can configure in application.properties:
spring.mvc.servlet.path=/api
Try using a PathMatchConfigurer (Spring Boot 2.x):
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.addPathPrefix("api", HandlerTypePredicate.forAnnotation(RestController.class));
}
}
This solution applies if:
- You want to prefix
RestController
but notController
. You are not using Spring Data Rest.
@Configuration public class WebConfig extends WebMvcConfigurationSupport { @Override protected RequestMappingHandlerMapping createRequestMappingHandlerMapping() { return new ApiAwareRequestMappingHandlerMapping(); } private static class ApiAwareRequestMappingHandlerMapping extends RequestMappingHandlerMapping { private static final String API_PATH_PREFIX = "api"; @Override protected void registerHandlerMethod(Object handler, Method method, RequestMappingInfo mapping) { Class<?> beanType = method.getDeclaringClass(); if (AnnotationUtils.findAnnotation(beanType, RestController.class) != null) { PatternsRequestCondition apiPattern = new PatternsRequestCondition(API_PATH_PREFIX) .combine(mapping.getPatternsCondition()); mapping = new RequestMappingInfo(mapping.getName(), apiPattern, mapping.getMethodsCondition(), mapping.getParamsCondition(), mapping.getHeadersCondition(), mapping.getConsumesCondition(), mapping.getProducesCondition(), mapping.getCustomCondition()); } super.registerHandlerMethod(handler, method, mapping); } }
}
This is similar to the solution posted by mh-dev, but I think this is a little cleaner and this should be supported on any version of Spring Boot 1.4.0+, including 2.0.0+.
Per Spring Data REST docs, if using application.properties, use this property to set your base path:
spring.data.rest.basePath=/api
But note that Spring uses relaxed binding, so this variation can be used:
spring.data.rest.base-path=/api
... or this one if you prefer:
spring.data.rest.base_path=/api
If using application.yml, you would use colons for key separators:
spring:
data:
rest:
basePath: /api
(For reference, a related ticket was created in March 2018 to clarify the docs.)
worked server.contextPath=/path
참고URL : https://stackoverflow.com/questions/32927937/how-to-set-base-url-for-rest-in-spring-boot
'programing' 카테고리의 다른 글
jquery로 div에서 스타일 속성 추가 및 제거 (0) | 2020.09.02 |
---|---|
C auto 키워드는 어디에 사용됩니까? (0) | 2020.09.02 |
매개 변수가 너무 많은 (6 개 이상) 메서드를 리팩터링하는 가장 좋은 방법은 무엇입니까? (0) | 2020.09.02 |
응답 상태 코드 설정 (0) | 2020.09.02 |
버튼 클릭 Android에서 소리 재생 (0) | 2020.09.02 |