Ho una classe del caricatore che esegue le funzioni di caricamento dei dati in fase di avvio affinché la mia applicazione mi dia dati di prova.
L'idea è piuttosto semplice, sto leggendo in dati XML, usando JaxB per trasformarlo in un POJO e poi persistendo il POJO usando il repo JPA.
Ecco il mio codice (piuttosto piccolo):
Osservando il metodo parseFile
, creo una nuova istanza JaxB ma richiede la classe UserContainer. Il problema è che voglio riutilizzare questo metodo per potenzialmente infinitamente molti contenitori. Qual è il modo migliore per refactarlo per renderlo più generico?
Speravo di evitare la necessità di passare un riferimento al tipo di classe in ogni metodo successivo.
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
LOGGER.log(Level.INFO, "Preparing to load data into database");
try {
loadAndStoreUserData();
} catch (IOException | JAXBException e) {
LOGGER.log(Level.INFO, "Unable to store user data");
e.printStackTrace();
}
}
/**
* Loads up any test data from resources and stores into embedded DB for test env
* @throws IOException
* @throws JAXBException
*/
private void loadAndStoreUserData() throws IOException, JAXBException {
LOGGER.log(Level.INFO, "User data table being added to database");
UserContainer userData = (UserContainer) ingestFromFile("testDatabase/users.xml", UserContainer);
userData.getUsers().stream().forEach(userRepo::save);
}
/**
* Read in file from static resources dir
* @param fileName
* @return
* @throws IOException
* @throws JAXBException
*/
private Object ingestFromFile(String fileName, Object classReference) throws IOException, JAXBException {
Resource resource = new ClassPathResource(fileName);
return parseFile(resource.getFile());
}
/**
* Takes input file from disk and parsed out contents by marshaling XML -> POJO
* @param inputFile
* @return
* @throws JAXBException
*/
private Object parseFile(File inputFile) throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(UserContainer.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
return jaxbUnmarshaller.unmarshal(inputFile);
}
}