2015-12-14 52 views
12

我要創建一個webservice的休息申請,我需要加載存在作爲參數傳遞的文件夾中的所有文件JSON(在application.yml先驗) ,在應用程序啓動時,稍後在webservices的方法中使用它們作爲bean的列表(每個JSON文件對應一個bean)。最佳方式

的樣品來進一步說明我的要求:

application.yml

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

MyApplication.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文件的相關信息先驗:

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

並號召Operator.java包含所有運營商的相關信息的類。

是否有一種方法可以在應用程序啓動時初始化一個包含所有JSON文件信息的ContextOperatorBean對象列表,並在我的webservice方法(RestAPI.java類)中使用它們?

+1

_「(...)在Web服務的方法,如豆類列表中使用它們(每JSON文件對應於一個bean)」 _ - 你能更詳細地解釋這一點,最好展示一個例子。 – kryger

回答

6

不知道,如果下面的天真實現滿足是「最好的」繞圈,但你可以創建一個新的服務,這種責任涉及,例如:

@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()僅過濾匹配的條目。

+0

對我來說,這個實現符合「最好」的標準。 非常感謝你Kryger。 它工作得很好 – diamah

+0

嗨@Kryger,感謝您的解決方案,我有一個類似的問題集,但'字符串jsonConfigFolder;'總是指向'null'。我可能做錯了什麼? – Napster

+0

這可能是由你的組件沒有被春天拾起來解釋,最有可能不包括在組件掃描或通過'new'實例化。如果這不能幫助您的最佳選擇是發佈一個新問題並詳細描述您的問題。 – kryger