带标头的微服务版本控制

时间:2020-07-07 09:07:00

标签: java spring spring-boot rest spring-data-jpa

问题是当我为 v1 大张旗鼓时,我可以看到一个有效的端点,但是对于 v2 ,我在控制器内给出了两个端点,但是{{ 1}}我看不到端点。下面是控制器。

控制器v1:

/allusers

控制器v2:

package com.springboot.rest.controller.v1;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.springboot.rest.dto.UserDto;
import com.springboot.rest.service.UserService;

@RestController(value = "userControllerV1")
@RequestMapping(value = "/userinfo", produces = "application/json")
public class UserController {

    public static final String X_ACCEPT_VERSION_V1 = "X-Accept-Version" + "=" + "v1";
    @Autowired
    private UserService userService;

    @GetMapping(value = "/allusers", headers = X_ACCEPT_VERSION_V1)
    public List<UserDto> getUserinfo() {
        List<UserDto> finalResults = userService.getAllUserInfo();
        return finalResults;
    }
}

并且我不想更改我的package com.springboot.rest.controller.v2; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.springboot.rest.dto.UserDto; import com.springboot.rest.service.UserService; @RestController(value = "userControllerV2") @RequestMapping(value = "/userinfo", produces = MediaType.APPLICATION_JSON_VALUE) public class UserController { public static final String X_ACCEPT_VERSION_V2 = "X-Accept-Version" + "=" + "v2"; @Autowired private UserService userService; @GetMapping(value = "/allusers", headers = X_ACCEPT_VERSION_V2) public List<UserDto> getUserinfo() { List<UserDto> finalResults = userService.getAllUserInfo(); return finalResults; } @GetMapping(value = "/message", headers = X_ACCEPT_VERSION_V2) public String greetMessage() { return userService.getGreetMessage(); } } 方法,有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

/ allusers 端点的

URI路径在两个控制器中都是相同的,因为在整个应用程序中api端点应该是唯一的。您可以在uri中添加版本,以使其具有唯一性。例如。

@RequestMapping(值=“ / v2 / userinfo”,产生= MediaType.APPLICATION_JSON_VALUE)

答案 1 :(得分:0)

我做了很多方法,但是最终OpenApi并添加了filter为我做了。下面是OpenApiConfig文件和想要实现此目标的人的链接。

@Configuration
public class OpenApiConfig {

    @Bean
    public OpenAPI customOpenApi() {
        return new OpenAPI()
                .components(new Components())
                .info(new Info().title("User-Management Microservice")
                .description("demo-microservice for user-management")
                .termsOfService("www.abc.com")
                .contact(new io.swagger.v3.oas.models.info.Contact()
                .email("abc.com")
                .name("user-management"))
                .version("1.0"));
    }
    
    @Bean
    public GroupedOpenApi v1OpenApi() {
        String[] packagesToScan = {"com.springboot.rest.controller.v1"};
        return GroupedOpenApi.builder().setGroup("v1 version").packagesToScan(packagesToScan).build();
    }
    
    @Bean
    public GroupedOpenApi v2OpenApi() {
        String[] packagesToScan = {"com.springboot.rest.controller.v2"};
        return GroupedOpenApi.builder().setGroup("v2 version").packagesToScan(packagesToScan).build();
    }

}

使用下面的链接进行逐步说明:

https://www.youtube.com/watch?v=Z4FwdCgik5M