Лучший способ загрузить некоторые файлы JSON в приложение Spring Boot



Я собираюсь создать приложение REST webservice, и мне нужно загрузить все файлы JSON, которые существуют в папке, переданной в качестве параметра (в приложении.yml a priori), при запуске приложения, чтобы использовать их позже в методах веб-сервисов в качестве списка бобов (каждый файл JSON соответствует Бобу).



Пример для дальнейшего разъяснения моих требований:



Применение.yml :



json.config.folder: /opt/my_application/json_configs


Мое приложение.java :



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;
}
}


ContextOperatorBean.java , который будет содержать JSON-файл infos a priori:



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;
}
}


И другой класс, называемый оператором.java, содержащая всю информацию об операторах.



Есть ли способ инициализировать список объектов ContextOperatorBean, содержащий информацию обо всех файлах JSON, при запуске приложения и использовать их в методах my webservice (RestAPI.класс java)?

483   1  

1 ответ:

Не знаю, удовлетворяет ли следующая наивная реализация критерию "лучший", но вы можете создать новую службу, которая занимается этой ответственностью, например:

@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;
    }
}

Примечание: опущены ошибки обработки или непредвиденные условия и некоторые детали реализации.

Затем @Autowire это в вашем контроллере и вызовите getMatchingOperators(), чтобы отфильтровать только соответствующие записи.

Comments

    Ничего не найдено.