[java] 스프링 부트에서 휴식을 위해 기본 URL을 설정하는 방법은 무엇입니까?

단일 스프링 부트 프로젝트에서 mvc와 휴식을 혼합하려고합니다.

난과 주석을 각 컨트롤러 싶지 않아 (모든 나머지 컨트롤러 (예. example.com/api) 하나의 장소에 대한 설정 기본 경로에 원하는 @RequestMapping('api/products')대신에, 단지를 @RequestMapping('/products').

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

가능할까요?

(나는 spring data rest를 사용하지 않고 spring mvc 만 사용합니다)



답변

Spring Boot 1.2 + (<2.0)에서는 application.properties의 단일 속성 만 있으면됩니다.

spring.data.rest.basePath=/api

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

2.x의 경우

server.servlet.context-path=/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);
                    }
                };
            }
        };
    }
}


답변

이 간단한 질문에 대한 답이 얼마나 복잡한 지 믿을 수 없었습니다. 다음은 몇 가지 참고 자료입니다.

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

  1. server.context-path=/api에서 설정 application.properties하면 모든 것에 대한 접두사를 구성 할 수 있습니다 . (server.contextPath가 아닌 server.context-path!)
  2. 저장소를 나머지 끝점으로 노출하는 @RepositoryRestController 주석이 달린 SpringData 컨트롤러 spring.data.rest.base-pathapplication.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);
    }
}

스프링 부트는 두 개의 디스패처 서블릿을 등록합니다- dispatcherServlet컨트롤러에 대한 기본값 과 restApi@RestControllers정의 된 디스패처 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 [/]

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>

그러나 다음으로 제한되지않습니다 .

  • 를 사용 XmlWebApplicationContext하면 사용 가능한 다른 컨텍스트 유형을 사용할 수 있습니다. AnnotationConfigWebApplicationContext, GenericWebApplicationContext, GroovyWebApplicationContext, …
  • 정의 jsonMessageConverter, messageConverters나머지 컨텍스트의 빈, 부모 컨텍스트에서 정의 될 수 있음