gpt4 book ai didi

java - REST API 自动连接服务的远程或本地实现

转载 作者:行者123 更新时间:2023-12-02 02:39:17 24 4
gpt4 key购买 nike

我有一个基于 Spring Boot 构建的 REST API,由 2 个独立的 Web 服务组成。我不知道这两个 Web 服务是否将托管在同一台计算机上,所以我想为所有服务进行远程和本地实现。下面的例子:

本地服务实现:

public class LocalExampleService implements ExampleService{

public Item getItem(long id){
//Get item using implementation from another local project
}
}

远程服务实现:

public class RemoteExampleService implements ExampleService{

@Value("${serviceURL}")
private String serviceURL;

public Item getItem(long id){
//Get item calling remote service
}
}

Controller :

public class MyController{
@Autowired
private ExampleService exampleService;
}

Web 服务有许多具有本地和远程实现的服务,我想让 Spring 知道它应该为所有服务选择哪种类型的实现。

我一直在考虑将 url 放入属性文件中,并且在初始化期间应用程序将检查属性是否包含 url,然后适本地 Autowiring 服务。但随后我就必须为每个服务 Autowiring 编写逻辑。

Autowiring 正确服务实现的最佳选择是什么?

最佳答案

您可以使用 Spring 配置文件来通过 spring 属性控制应使用哪个版本的实现。

在 spring 属性中添加以下条目

spring.profiles.active=NAME_OF_ACTIVE_PROFILE

每个服务实现都需要配置文件注释。您的服务实现应该是这样的:

@Component
@Profile("local")
public class LocalExampleService implements ExampleService{}

@Component
@Profile("remote")
public class RemoteExampleService implements ExampleService{}

如果您的项目需要使用服务的本地实现,则在属性中而不是 NAME_OF_ACTIVE_PROFILE 中插入本地或远程。

对于全自动 Autowiring ,您需要添加在启动时运行的方法,检查本地实现类是否存在,然后正确设置配置文件。为此,您需要修改 spring boot main 方法中的代码:

public static void main(String[] args){
String profile = checkCurrentProfile(); //Method that decides which profile should be used
System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, profile);
SpringApplication.run(MyApplication.class, args);
}

如果您选择此方法,则不需要之前在属性文件中输入内容。

关于java - REST API 自动连接服务的远程或本地实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45757001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com