用于评估OS的Spring表达式

6ju8rftf  于 2023-03-28  发布在  Spring
关注(0)|答案(3)|浏览(131)

我想评估OS(操作系统)系统属性以加载环境对应的配置文件。例如,如果OS评估为Windows,则将加载properties-win.xml * 或 * 如果OS评估为Unix或Linux,则将加载properties-unix.xml
下面的spel工作正常

#{(systemProperties['os.name'].indexOf('nix') >= 0 or systemProperties['os.name'].indexOf('nux') >= 0 or systemProperties['os.name'].indexOf('aix') > 0 ) ? 'linux' : 
        ((systemProperties['os.name'].indexOf('Win') >= 0) ? 'windows' : 'Unknow OS')}

但是为了代替每次都计算systemProperties['os.name'],我想在一个变量中有这个,然后想匹配条件6.5.10.1。

#{systemProperties['os.name'].?((#this.indexOf('nix') >= 0 or #this.indexOf('nux') >= 0 or #this.indexOf('aix') > 0 ) ? 'unix' : 
    (#this.indexOf('win') >= 0) ? 'windows' : 'Unknown')}

但不知何故,它给出了解析异常。
有人能给点建议吗?

cgyqldqp

cgyqldqp1#

这个方法怎么样,一个更优雅的方法,我会说。需要Spring 4。

public class WindowsEnvironmentCondition implements Condition {
     public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) {
          return context.getEnvironment().getProperty("os.name").indexOf("Win") >= 0;
     }
}

public class LinuxEnvironmentCondition implements Condition {
     public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) {
          return (context.getEnvironment().getProperty("os.name").indexOf("nux") >= 0 
                 || context.getEnvironment().getProperty("os.name").indexOf("aix") >= 0);
     }
}

然后,您可以使用上面的Conditions来注解要根据环境加载的所需方法或类:

@Configuration
@Conditional(LinuxEnvironmentCondition.class)
@ImportResource("classpath:/META-INF/spring/linux.xml")
public class LinuxConfig {

private @Value("${test}") String message;

public @Bean
ExampleService service() {
    ExampleService service = new ExampleService();
    service.setMessage(message);
    return service;
}
}

@Configuration
@Conditional(WindowsEnvironmentCondition.class)
@ImportResource("classpath:/META-INF/spring/windows.xml")
public class WindowsConfig {

private @Value("${test}") String message;

public @Bean
ExampleService service() {
    ExampleService service = new ExampleService();
    service.setMessage(message);
    return service;
}
}

linux.xml:

<context:property-placeholder location="classpath:/META-INF/spring/linux.properties" />

windows.xml:

<context:property-placeholder location="classpath:/META-INF/spring/windows.properties" />

也许它可以得到更多的增强,但只是想告诉你另一个想法,使用某些xml文件取决于操作系统。

hwamh0ep

hwamh0ep2#

无法在Spel表达式中设置变量。必须根据上下文设置变量。您可以按照

context.setVariable("os", SystemProperties.getProperty("os.name"));

然后在Spel中将其用作#os

wmtdaxz3

wmtdaxz33#

对于未来的搜索,遵循另一种选择:

root:
  pathLinux: ${ROOT_PATH_LINUX:/mnt/data/}
  pathWindows: ${ROOT_PATH_WINDOWS:F:/data/}
  path: "${ROOT_PATH:#{systemProperties['os.name'].toLowerCase().contains(\"windows\") ? \"${root.pathWindows}\" : \"${root.pathLinux}\" }}"

在这种情况下,可以使用ROOT_PATH环境变量,或ROOT_PATH_LINUX,或ROOT_PATH_WINDOWS,操作系统特定的变量来覆盖配置。

相关问题