Spring Cloud Config Server是否是硬编码路径的有效解决方案?

问题描述

晚上好! 我正在尝试学习如何使用Spring Boot实现微服务架构,并且在项目中遇到一些硬编码路径时遇到了麻烦。

我的代码中有2个特殊的类,我必须手动放置这些路径,它们是:

  1. discoverClientConfiguration.java:制成此类是为了通过https连接到discovery Server,要实现它,我遵循了tutorial在这里代码

    System.setProperty("javax.net.ssl.keyStore","C:\\ ..my file system path.. \\THIS PROJECT FOLDER\\src\\main\\resources\\keystore\\gateway.jks");
    System.setProperty("javax.net.ssl.keyStorePassword","**");
    
    System.setProperty("javax.net.ssl.trustStore","C:\\ ..my file system path.. \\THIS PROJECT FOLDER\\src\\main\\resources\\keystore\\gateway.jks");
    System.setProperty("javax.net.ssl.trustStorePassword","**");
    
  2. RestTemplateConfiguration.java:制成此类是为了使用https调用外部休息服务,为了实现它,我遵循了tutorial。这里的情况甚至更糟,因为我必须将路径放置到另一个项目中的.jks文件中,这里是代码

    private HttpComponentsClientHttpRequestFactory validateSSL(){
    
    String location = "C:\\ ..my file system path.. \\ANOTHER PROJECT FOLDER\\src\\main\\resources\\keystore\\be_device.jks";
    String pass = "++"; ... some more code ...
    }
    

您可以想象,每当有人拉出代码时,他/她将不得不更改那些不理想的路径。

在第一种情况下,我尝试创建一个.properties文件以使用classpath:表示法,但是它不起作用,并且在运行时出现了一些异常。

在第二种情况下,我尝试使用这种表示法

..\\..\\Centro\\Centro-Device\\src\\main\\resources\\keystore\\be_device.jks

为了不显式地写入我的文件系统路径,但在我的PC(Windows 10 Professional)中在运行时不起作用。另一方面,在另一位使用Linux Mint的同事的机器上,他说../../Centro/Centro-Device/src/main/resources/keystore/be_device.jks这个符号正确运行(我已经在我的系统上测试过,并且在运行时不起作用)。

您是否认为使用Spring Cloud创建Config Server可能是解决此问题的有价值的解决方案? 我当时正在考虑将所有文件系统路径放入Config Server中,并根据使用的计算机来获取它们。您如何看待这个想法?

编辑

对不起,如果我不能很好地说明自己。我的问题不是基于在某些.properties中的路径移动这一事实,我想拥有一个可以在多个路径选项之间自动进行选择的环境,因为我已经尝试了使用@Value之类的注释的解决方案。 几乎类似于discoveryServer,但用于文件路径。 问题在于,在这种特定情况下,该软件将无法正常运行,因为它需要指向指定文件的整个文件系统路径。

解决方法

选项1: 将这些属性放在您的selectOfferViaRouter = false; offers: Offer[] = []; selectedOfferId = -1; trigger: any; constructor( private offerService: OfferService,private router: Router,private activatedRoute: ActivatedRoute) { } ngOnInit(): void { this.getAllOffers(); } ngOnChanges(): void { this.getAllOffers(); } // get all offers on observable getAllOffers(): void { this.offerService.getAll().subscribe(data => { this.offers = data; }); } // to update the table of offers detectTrigger(event: Event): void { this.getAllOffers(); console.log(this.offers); } selectOffer(id: number): void { this.router.navigate([id],{relativeTo: this.activatedRoute}); } addOffer(): void{ this.offerService.AddOffer(); } 文件中,Spring Boot框架将在为您启动时更新环境。 您可以使用application.properties批注来初始化spring组件类中的字段。

类似这样的东西:

@Value

选项2: 在您的项目中创建其他\外部@Component public class YourClass { @Value("${your.property.key})" private String path; } 文件,并将这些属性放入其中。 用config.properties批注对属性消费者类进行批注,并为其提供config.properties文件的路径。

使用上述的Value注释或从System检索这些属性。