我正在使用Spring从.properties
文件加载属性属性,如下所示:
file: elements.properties
base.module.elementToSearch=1
base.module.elementToSearch=2
base.module.elementToSearch=3
base.module.elementToSearch=4
base.module.elementToSearch=5
base.module.elementToSearch=6
spring xml文件
file: myapplication.xml
<bean id="some"
class="com.some.Class">
<property name="property" value="#{base.module.elementToSearch}" />
</bean>
我的Class.java
file: Class.java
public void setProperty(final List<Integer> elements){
this.elements = elements;
}
但是在调试时,参数元素只获取列表中的最后一个元素,因此,有一个值为“6”的元素列表,而不是包含6个元素的列表。
我尝试了其他方法,例如仅添加值#{base.module}
,但它在属性文件中找不到任何参数。
解决方法是在elements.properties文件中添加一个以逗号分隔的列表,例如:
base.module.elementToSearch=1,2,3,4,5,6
并将其用作String并解析它,但是有更好的解决方案吗?
答案 0 :(得分:145)
如果您在属性文件中定义数组,如:
base.module.elementToSearch=1,2,3,4,5,6
您可以在Java类中加载此类数组,如下所示:
@Value("${base.module.elementToSearch}")
private String[] elementToSearch;
答案 1 :(得分:20)
以下是如何在Spring 4.0 +
中执行此操作的示例application.properties
内容:some.key=yes,no,cancel
@Autowire
private Environment env;
...
String[] springRocks = env.getProperty("some.key", String[].class);
答案 2 :(得分:18)
除了逗号之外你还有一个不同的分隔符,你也可以使用它。
@Value("#{'${my.config.values}'.split(',')}")
private String[] myValues; // could also be a List<String>
和
在您的应用程序属性中
my.config.values=value1, value2, value3
答案 3 :(得分:1)
使用Spring Boot可以执行以下操作:
values[0]=abc
values[1]=def
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@ConfigurationProperties
public class Configuration {
List<String> values = new ArrayList<>();
public List<String> getValues() {
return values;
}
}
这是必需的,没有此类或没有values
的类将无法正常工作。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.List;
@SpringBootApplication
public class SpringBootConsoleApplication implements CommandLineRunner {
private static Logger LOG = LoggerFactory.getLogger(SpringBootConsoleApplication.class);
// notice #{} is used instead of ${}
@Value("#{configuration.values}")
List<String> values;
public static void main(String[] args) {
SpringApplication.run(SpringBootConsoleApplication.class, args);
}
@Override
public void run(String... args) {
LOG.info("values: {}", values);
}
}
答案 4 :(得分:0)
如果需要传递星号,则必须用引号将其引起来。
就我而言,我需要为websocket配置cors。因此,我决定将cors网址放入application.yml。对于prod env,我将使用特定的url,但是对于dev,可以只使用*。
在yml文件中,我有:
dupRow_1 = pd.DataFrame({
'Product':list('abcdef'),
'Order ID':[np.nan,5,4,5,5,np.nan],
})
dupRow_1['Grouped'] = (dupRow_1['Product'].groupby(dupRow_1['Order ID'].fillna('missing'))
.transform(lambda x: ','.join(x)))
print (dupRow_1)
Product Order ID Grouped
0 a NaN a,f
1 b 5.0 b,d,e
2 c 4.0 c
3 d 5.0 b,d,e
4 e 5.0 b,d,e
5 f NaN a,f
在Config类中,我有:
websocket:
cors: "*"