복붙노트

[SPRING] 스프링 부팅시 기본 URL을 설정하는 방법은 무엇입니까?

SPRING

스프링 부팅시 기본 URL을 설정하는 방법은 무엇입니까?

나는 하나의 봄 부팅 프로젝트에서 mvc와 나머지를 혼합하려고 노력하고있다.

모든 나머지 컨트롤러 (예 : example.com/api)의 기본 경로를 설정하고 싶습니다. @RequestMapping ( '/ products') 대신 @RequestMapping ( 'api / products')를 사용하여 각 컨트롤러에 주석을 달지 않아도됩니다.

Mvc 컨트롤러는 example.com/whatever가 액세스 할 수 있어야합니다.

가능한가?

(나는 스프링 데이터를 사용하지 않는다, 단지 봄 mvc)

해결법

  1. ==============================

    1.Spring Boot 1.2 이상에서는 application.properties에 하나의 속성 만 있으면됩니다.

    Spring Boot 1.2 이상에서는 application.properties에 하나의 속성 만 있으면됩니다.

    spring.data.rest.basePath=/api
    

    ref 링크 : https://docs.spring.io/spring-data/rest/docs/current/reference/html/#getting-started.changing-base-uri

  2. ==============================

    2.조금 늦었지만 같은 질문이 대답에 도달하기 전에 나를 데려왔다. 그래서 나는 그것을 여기에 게시한다. Application.properties를 생성하고 (아직 가지고 있지 않다면) 추가합니다.

    조금 늦었지만 같은 질문이 대답에 도달하기 전에 나를 데려왔다. 그래서 나는 그것을 여기에 게시한다. Application.properties를 생성하고 (아직 가지고 있지 않다면) 추가합니다.

    server.contextPath=/api
    

    그래서 이전 예에서 @RequestMapping ( "/ test")으로 RestController를 가지고 있다면 localhost : 8080 / api / test / {your_rest_method}와 같이 접근 할 것입니다.

    질문 소스 : 어떻게 내 봄 부팅 webapp에 대한 URL을 선택합니까

  3. ==============================

    3.이후이 문제에 대한 첫 번째 구글 히트이고 더 많은 사람들이 이것을 검색합니다 가정합니다. Spring Boot '1.4.0'이후 새로운 옵션이 있습니다. @RestController로 주석 된 클래스에 대해 다른 경로를 정의 할 수있는 사용자 정의 RequestMappingHandlerMapping을 정의 할 수 있습니다.

    이후이 문제에 대한 첫 번째 구글 히트이고 더 많은 사람들이 이것을 검색합니다 가정합니다. 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);
                        }
                    };
                }
            };
        }
    }
    
  4. ==============================

    4.나는이 겉으로보기에는 단순한 질문에 대한 답을 복잡하게 만드는 것이 얼마나 믿을 수 없었습니다. 다음은 참고 문헌입니다.

    나는이 겉으로보기에는 단순한 질문에 대한 답을 복잡하게 만드는 것이 얼마나 믿을 수 없었습니다. 다음은 참고 문헌입니다.

    고려해야 할 여러 가지가 있습니다.

    또 다른 해결 방법은 간단한 트릭입니다. 주석에 정적 String의 접두어를 붙일 수는 없지만 다음과 같은 표현식을 사용할 수 있습니다.

    @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\"}";
      }
    }
    
  5. ==============================

    5.스프링 부트 프레임 워크 버전 2.0.4.RELEASE +의 경우. 이 줄을 application.properties에 추가하십시오.

    스프링 부트 프레임 워크 버전 2.0.4.RELEASE +의 경우. 이 줄을 application.properties에 추가하십시오.

    server.servlet.context-path=/api
    
  6. ==============================

    6.나머지 컨트롤러에만 영향을 미치는 깨끗한 솔루션을 발견했습니다.

    나머지 컨트롤러에만 영향을 미치는 깨끗한 솔루션을 발견했습니다.

    @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);
        }
    }
    

    스프링 부트는 컨트롤러를위한 기본 dispatcherServlet과 rest.xml에 정의 된 @RestControllers를위한 restApi 디스패처라는 두 개의 디스패처 서블릿을 등록합니다.

    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 [/]
    

    예제 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>
    

    하지만, 당신은 다음에 국한되지 않습니다 :

  7. ==============================

    7.조금 늦을 수도 있지만, 최선의 해결책이라고 생각합니다. application.yml (또는 유사 설정 파일)에 설정하십시오 :

    조금 늦을 수도 있지만, 최선의 해결책이라고 생각합니다. application.yml (또는 유사 설정 파일)에 설정하십시오 :

    spring:
        data:
            rest:
                basePath: /api
    

    내가 기억할 수 있듯이 모든 리포지토리가이 URI 아래에 노출됩니다.

  8. ==============================

    8.부팅 2.0.0 + 나를 위해이 작품 : server.servlet.context-path = / api

    부팅 2.0.0 + 나를 위해이 작품 : server.servlet.context-path = / api

  9. ==============================

    9.컨트롤러에 대한 사용자 정의 주석을 만들 수 있습니다.

    컨트롤러에 대한 사용자 정의 주석을 만들 수 있습니다.

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @RestController
    @RequestMapping("/test")
    public @interface MyRestController {
    }
    

    컨트롤러 클래스에서 일반적인 @RestController 대신 @RestController를 사용하고 @RequestMapping을 사용하여 메소드에 주석을 지정하십시오.

    방금 테스트되었습니다 - Spring 4.2에서 작동합니다!

  10. ==============================

    10.@RequestMapping ( "rest") 주석을 사용하여 기본 클래스를 만들고이 기본 클래스로 다른 모든 클래스를 확장 할 수 있습니다.

    @RequestMapping ( "rest") 주석을 사용하여 기본 클래스를 만들고이 기본 클래스로 다른 모든 클래스를 확장 할 수 있습니다.

    @RequestMapping("rest")
    public abstract class BaseController {}
    

    이제이 기본 클래스를 확장하는 모든 클래스는 rest / **에서 액세스 할 수 있습니다.

  11. ==============================

    11.이 솔루션은 다음과 같은 경우에 적용됩니다.

    이 솔루션은 다음과 같은 경우에 적용됩니다.

    이것은 mh-dev에 의해 게시 된 솔루션과 비슷하지만 조금 더 깔끔하고 2.0.0+를 포함한 모든 버전의 Spring Boot 1.4.0+에서 지원되어야한다고 생각합니다.

  12. from https://stackoverflow.com/questions/32927937/how-to-set-base-url-for-rest-in-spring-boot by cc-by-sa and MIT license