복붙노트

[SPRING] Spring Boot에서 모든 컨트롤러의 접두어를 지정하는 방법?

SPRING

Spring Boot에서 모든 컨트롤러의 접두어를 지정하는 방법?

나는 / user와 / order에 컨트롤러 매핑을 가지고있다 :

@RestController
@RequestMapping("/users")
public class UserController {
    ...
}

@RestController
@RequestMapping("/orders")
public class OrderController {
    ...
}

http : // localhost : 8080 / api / users 및 http : // localhost : 8080 / api / orders에서 각각 URL에 액세스하려고합니다.

스프링 부트에서 어떻게 이것을 할 수 있습니까?

해결법

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

    1.사용자 정의 구성에서 스프링 부트 응용 프로그램의 루트 컨텍스트 경로를 / api / *에 매핑 할 수 있습니다.

    사용자 정의 구성에서 스프링 부트 응용 프로그램의 루트 컨텍스트 경로를 / api / *에 매핑 할 수 있습니다.

    import org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration;
    import org.springframework.boot.context.embedded.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.DispatcherServlet;
    
    @Configuration
    public class DispatcherServletCustomConfiguration {
    
        @Bean
        public DispatcherServlet dispatcherServlet() {
            return new DispatcherServlet();
        }
    
        @Bean
        public ServletRegistrationBean dispatcherServletRegistration() {
            ServletRegistrationBean registration = new ServletRegistrationBean(
                    dispatcherServlet(), "/api/");
            registration.setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);
            return registration;
        }
    }
    

    src \ main \ resources 폴더의 application.properties 파일에 추가하십시오.

    server.contextPath=/api/*
    

    더 많은 정보를 원하시면 Spring Boot Context Root와 여기 DispatcherServlet에 서블릿 매핑 추가하기

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

    2.일부 컨트롤러에만 접두사를 추가하려면 다른 두 가지 솔루션을 찾았습니다.

    일부 컨트롤러에만 접두사를 추가하려면 다른 두 가지 솔루션을 찾았습니다.

    @RestController
    @RequestMapping(path = "${v1API}/users")
    public class V1FruitsController {
    
        @GetMapping(path = "")
        @ResponseBody
        public String list(){
            return "[\"Joe\", \"Peter\"]";
        }
    }
    

    application.properties

    v1API=/api/v1
    
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component
    @RequestMapping("/api/v1")
    public @interface V1APIController {
        @AliasFor(annotation = Component.class)
        String value() default "";
    }
    
    
    @V1APIController
    public class UserController {
    
        @RequestMapping("/users")
        @ReponseBody
        public String index(){
            return "[\"Joe\", \"Peter\"]";
        }
    }
    

    테스트 해봐.

    curl -X GET localhost:8080/api/users
    
  3. ==============================

    3.스프링 부트 2 (스프링 프레임 워크 5)를 사용하는 경우 application.properties에 속성이 대체됩니다.

    스프링 부트 2 (스프링 프레임 워크 5)를 사용하는 경우 application.properties에 속성이 대체됩니다.

    server.contextPath
    

    에 대한:

    server.servlet.context-path=
    
  4. ==============================

    4.관심이있는 분들은 여기 application.yaml에서 spring.data.rest.basePath 또는 server.servlet.contextPath를 사용할 수 없어서 deFreitas의 Option 2 Component를 Kotlin이 사용합니다. (이것은 Spring 부트 2.1.2와 Kotlin 1.13.11을 사용하는 것입니다)

    관심이있는 분들은 여기 application.yaml에서 spring.data.rest.basePath 또는 server.servlet.contextPath를 사용할 수 없어서 deFreitas의 Option 2 Component를 Kotlin이 사용합니다. (이것은 Spring 부트 2.1.2와 Kotlin 1.13.11을 사용하는 것입니다)

    package com.myproject.controller
    
    import org.springframework.core.annotation.AliasFor
    import org.springframework.stereotype.Component
    import org.springframework.web.bind.annotation.RequestMapping
    
    import kotlin.annotation.MustBeDocumented
    import kotlin.annotation.Retention
    import kotlin.annotation.Target
    import kotlin.annotation.AnnotationRetention
    
    @Target(AnnotationTarget.CLASS, AnnotationTarget.FILE)
    @Retention(AnnotationRetention.RUNTIME)
    @MustBeDocumented
    @Component
    @RequestMapping("/api/v1")
    annotation class V1ApiController(
        @get:AliasFor(annotation = Component::class)
        val value: String = ""
    )
    

    IntelliJ를 사용하는 경우 가져 오기를 최적화하면 간결하게 Kotlin 주석 가져 오기가 제거됩니다.

  5. from https://stackoverflow.com/questions/28006501/how-to-specify-prefix-for-all-controllers-in-spring-boot by cc-by-sa and MIT license