Java 将一些JSON文件加载到Spring启动应用程序中的最佳方法
我将要创建一个Rest webservice应用程序,我需要在应用程序启动时加载作为参数传递的文件夹(在application.yml中)中存在的所有JSON文件,以便稍后在webservices的方法中将其用作bean列表(每个JSON文件对应一个bean) 进一步解释我的要求的示例: 应用程序.yml:Java 将一些JSON文件加载到Spring启动应用程序中的最佳方法,java,json,spring-boot,Java,Json,Spring Boot,我将要创建一个Rest webservice应用程序,我需要在应用程序启动时加载作为参数传递的文件夹(在application.yml中)中存在的所有JSON文件,以便稍后在webservices的方法中将其用作bean列表(每个JSON文件对应一个bean) 进一步解释我的要求的示例: 应用程序.yml: json.config.folder: /opt/my_application/json_configs package com.company; import org.springfr
json.config.folder: /opt/my_application/json_configs
package com.company;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
MyApplication.java:
json.config.folder: /opt/my_application/json_configs
package com.company;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
具有此结构的JSON文件:
{
"key":"YYYYY",
"operator_list":[
{
"name":"operator1",
"configs":{
"id":"XXXXX1",
"path":"xxxx2"
}
},
{
"name":"operator2",
"configs":{
"id":"XXXXX1",
"passphrase":"xxxx2",
"user_id":"XXXX3",
"password":"XXXXX"
}
},
{
"name":"operator3",
"configs":{
"user_id":"XXXXX1"
}
}
]
}
RestAPI.java
@RestController
@RequestMapping("/my_app_url")
@PropertySource(value={"classpath:application.yml"})
public class RestAPI {
//Some fields
....
//Some methods
....
//Method that return operator list of a given context (correspond to the field "key" of the json file)
@RequestMapping("/getOperatorList")
public List<Operator> getOperatorList(@RequestParam(value = "context", defaultValue = "YYYYY") String context) throws Exception{
List<Operator> result = null;
//Here, i need to loop the objects , that are supposed to be initialized during application startup
//(but i I do not know yet how to do it) with data from JSON files
//to find the one that correspond to the context in parameter and return its operator list
return result;
}
}
@RestController
@请求映射(“/my\u app\u url”)
@PropertySource(值={“classpath:application.yml”})
公共类RestAPI{
//一些领域
....
//一些方法
....
//方法返回给定上下文的运算符列表(对应于json文件的字段“key”)
@请求映射(“/getOperatorList”)
公共列表getOperatorList(@RequestParam(value=“context”,defaultValue=“YYYYY”)字符串上下文)引发异常{
列表结果=空;
//这里,我需要循环对象,这些对象应该在应用程序启动期间初始化
//(但我还不知道如何使用JSON文件中的数据)
//在参数中查找与上下文相对应的参数并返回其运算符列表
返回结果;
}
}
ContextOperatorBean.java将包含JSON文件信息:
package com.company.models;
import java.util.List;
public class ContextOperatorBean {
String key;
List<Operator> operator_list;
public ContextOperatorBean() {
}
public ContextOperatorBean(String key, List<PaymentMethod> operator_list) {
this.key = key;
this.operator_list = operator_list;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public List<Operator> getOperator_list() {
return operator_list;
}
public void setOperator_list(List<Operator> operator_list) {
this.operator_list = operator_list;
}
}
package com.company.models;
导入java.util.List;
公共类ContextOperatorBean{
字符串键;
列出操作员列表;
公共上下文运算符bean(){
}
公共上下文运算符bean(字符串键、列表运算符\u列表){
this.key=key;
this.operator\u list=operator\u list;
}
公共字符串getKey(){
返回键;
}
公共无效设置键(字符串键){
this.key=key;
}
公共列表getOperator_List(){
返回操作员列表;
}
公共无效设置操作员列表(列表操作员列表){
this.operator\u list=operator\u list;
}
}
和另一个名为Operator.java的类,包含所有操作员信息
是否有一种方法可以在应用程序启动时初始化包含所有JSON文件信息的
ContextOperatorBean
对象列表,并在我的webservice方法(RestAPI.java类)中使用它们?不知道以下天真的实现是否满足“最佳”标准,但您可以创建一个处理此责任的新服务,例如:
@Service
public class OperatorsService {
@Value("${json.config.folder}")
String jsonConfigFolder;
List<ContextOperatorBean> operators = new ArrayList<>();
@PostConstruct
public void init() throws IOException {
ObjectMapper jsonMapper = new ObjectMapper();
for (File jsonFile : getFilesInFolder(jsonConfigFolder)) {
// deserialize contents of each file into an object of type
ContextOperatorBean operator = jsonMapper.readValue(jsonFile, new TypeReference<List<ContextOperatorBean>>() {});
operators.add(operator);
}
}
public List<ContextOperatorBean> getMatchingOperators(String context) {
return operators.stream().filter(operator -> checkIfMatches(operator, context)).collect(Collectors.toList());
}
private boolean checkIfMatches(ContextOperatorBean operator, String context) {
// TODO implement
return false;
}
private File[] getFilesInFolder(String path) {
// TODO implement
return null;
}
}
@服务
公共类运营商服务{
@值(${json.config.folder}”)
字符串jsonConfigFolder;
列表运算符=新的ArrayList();
@施工后
public void init()引发IOException{
ObjectMapper jsonMapper=新的ObjectMapper();
对于(文件jsonFile:getfileinfolder(jsonconfig文件夹)){
//将每个文件的内容反序列化为类型为的对象
ContextOperatorBean operator=jsonMapper.readValue(jsonFile,新类型引用(){});
运算符。添加(运算符);
}
}
公共列表getMatchingOperators(字符串上下文){
return operators.stream().filter(operator->checkIfMatches(operator,context)).collect(Collectors.toList());
}
私有布尔checkIfMatches(ContextOperatorBean运算符,字符串上下文){
//待办事项实施
返回false;
}
私有文件[]GetFileInfolder(字符串路径){
//待办事项实施
返回null;
}
}
注意:遗漏了处理故障或意外情况以及一些实现细节
然后,
@Autowire
将其放入控制器中,并调用getMatchingOperators()
仅过滤匹配项。“(…)稍后在webservices的方法中将其用作bean列表(每个json文件对应一个bean)”-您能更详细地解释一下吗,最好给出一个示例,此实现满足“最佳”的标准。非常感谢你,克雷格。它工作得非常好hi@Kryger,谢谢你的解决方案,我有一个类似的问题集,但是字符串jsonConfigFolder代码>始终指向null
。我可能做错了什么?这可以解释为Spring没有提取您的组件,很可能没有包括在组件扫描中,或者通过new
实例化。如果这对你没有帮助,最好的选择是发布一个新问题并详细描述你的问题。唯一的改变是,我将使用InputStream而不是file对象,这样我就可以轻松地从类路径中读取