当前位置: 首页 > 面试题库 >

Spring特性取决于其他特性

伯建安
2023-03-14
问题内容

我想要一些属性,可以在Spring bean中通过@Value引用,只能依赖于其他属性来创建。特别是我有一个属性,它描述目录的文件系统位置。

myDir=/path/to/mydir

按照约定,该目录中有一个文件,始终称为 myfile.txt

现在,我想通过我的bean内的@Value注释访问目录和文件。有时我想以String形式访问它们,有时以java.io.Files形式访问它们,有时以org.springframework.core.io.FileSystemResource形式访问它们(顺便说一句,开箱即用!)。但是由于这个原因,按需串联字符串不是一个选择。

所以我当然可以只声明两个,但是我最终会得到

myDir=/path/to/mydir
myFile/path/to/mydir/myfile.txt

我想避免这种情况。

所以我想出了一个@Configuration类,该类接受属性并将其添加为新的PropertySource:

@Autowired
private ConfigurableEnvironment environment;

@Value("${myDir}")
private void addCompleteFilenameAsProperty(Path myDir) {
    Path absoluteFilePath = myDir.resolve("myfile.txt");

    Map<String, Object> props = new HashMap<>();
    props.put("myFile, absoluteFilePath.toString());
    environment.getPropertySources().addFirst(new MapPropertySource("additional", props));
}

如您所见,在我的上下文中,我什至创建了一个PropertyEditor,它可以转换为 java.nio.file.Path

现在的问题是,由于某种原因,它“可以在我的机器上工作”(在我的IDE中),但是不能在预期的目标环境上运行。我到了

java.lang.IllegalArgumentException: Could not resolve placeholder 'myFile' in string value "${myFile}"

问题答案:

春天可以结合属性

myDir=/path/to/mydir 
myFile=${myDir}/myfile.txt

您也可以使用默认值,而无需myFile先在属性中定义:

属性文件

myDir=/path/to/mydir

在班上:

@Value("#{myFile:${myDir}/myfile.txt}")
private String myFileName;


 类似资料:
  • 3.6. 其他特性 在以上章节中未被提及的,关于Spring 2.0的新特性与改进特性,都包含在最后部分。 3.6.1. 动态语言支持 Spring 2.0现在支持用非Java语言编写的bean。当前支持的动态语言包括JRuby,Groovy和BeanShell。标题为 第 25 章 动态语言支持 部分描述了动态语言支持的细节。 3.6.2. JMX Spring对JMX支持的变化更具有进步意义,

  • 6.1. 引用参数 小技巧 所有按引用传递的参数必须加上 const. 定义: 在 C 语言中, 如果函数需要修改变量的值, 参数必须为指针, 如 int foo(int *pval). 在 C++ 中, 函数还可以声明引用参数: int foo(int &val). 优点: 定义引用参数防止出现 (*pval)++ 这样丑陋的代码. 像拷贝构造函数这样的应用也是必需的. 而且更明确, 不接受 N

  • 8.2.1. 属性 8.2.1.1. 属性定义 8.2.1.2. 属性文件及优先级 8.2.1.3. 常用属性介绍 8.2.2. 钩子和模板 8.2.2.1. Git钩子 8.2.2.2. Git模板 8.2.3. 稀疏检出和浅克隆 8.2.3.1. 稀疏检出 8.2.3.2. 浅克隆 8.2.4. 嫁接和替换 8.2.4.1. 提交嫁接 8.2.4.2. 提交替换 8.2.5. Git评注 8.

  • 操作节点 Redisson NodesGroup 对象提供了对 Redis 节点的一些控制: NodesGroup nodesGroup = redisson.getNodesGroup(); nodesGroup.addConnectionListener(new ConnectionListener() { public void onConnect(InetSocketAddress

  • 其它安全特性 除了能力机制之外,还可以利用一些现有的安全机制来增强使用 Docker 的安全性,例如 TOMOYO, AppArmor, SELinux, GRSEC 等。 Docker 当前默认只启用了能力机制。用户可以采用多种方案来加强 Docker 主机的安全,例如: 在内核中启用 GRSEC 和 PAX,这将增加很多编译和运行时的安全检查;通过地址随机化避免恶意探测等。并且,启用该特性不需

  • 问题 我们建立了一个实习生Java spring的框架,我们在两个不同的项目中使用。一个项目使用OracleDB,另一个项目使用MS SQL。 当涉及保留的关键字时,MS SQL正在抱怨。因此我们通过转义来修复列名: 但现在它在oracle db中不再起作用了,因为生成的sql现在包含转义字符: 中选择myEntity.key,myEntity.foo 问题 是否可能根据db方言或某些外部属性,在