Načítajte zdroj ako reťazec na jar
1. Prehľad
V tejto príručke sa pozrieme na rôzne spôsoby, ako vstreknite obsah zdroja obsahujúceho text ako reťazec do našich jarných bôbov.
Pozrime sa na lokalizáciu zdroja a prečítanie jeho obsahu.
Tiež si ukážeme, ako zdieľať načítané zdroje medzi niekoľkými fazuľami. Ukážeme to pomocou anotácií súvisiacich so zavedením závislostí, aj keď to isté sa dá dosiahnuť aj použitím vstrekovania založeného na XML a deklarovaním fazule v súbore vlastností XML.
2. Pomocou Zdroj
Vyhľadanie zdrojového súboru môžeme zjednodušiť pomocou Zdroj rozhranie. Jar nám pomáha nájsť a prečítať zdroj pomocou nástroja na načítanie zdrojov, ktorý rozhodne o ktorom Zdroj implementácia zvoliť v závislosti na poskytnutej ceste. The Zdroj je v skutočnosti spôsob prístupu k obsahu zdroja, a nie k samotnému obsahu.
Pozrime sa na niekoľko spôsobov, ako získať a Zdroj napríklad pre zdroje v triede.
2.1. Použitím ResourceLoader
Môžeme použiť triedu ResourceLoader ak uprednostňujeme lenivé načítanie:
ResourceLoader resourceLoader = nový DefaultResourceLoader (); Resource resource = resourceLoader.getResource ("classpath: resource.txt");
Môžeme tiež podať injekciu ResourceLoader do našej fazule s @Autowired:
@Autowired private ResourceLoader resourceLoader;
2.2 Používanie @ Zdroj
Môžeme injekčne podať a Zdroj priamo do jarnej fazule s @Hodnota:
@Value ("classpath: resource.txt") súkromný zdrojový zdroj;
3. Konverzia z Zdroj do String
Akonáhle budeme mať prístup k Zdroj musíme byť schopní prečítať to do a String. Vytvorme a Čítačka zdrojov úžitková trieda so statickou metódou akoString urobiť to pre nás.
Najprv musíme získať InputStream:
InputStream inputStream = resource.getInputStream ();
Náš ďalší krok je podniknúť to InputStream a previesť ho na a String. Môžeme použiť Spring FileCopyUtils # copyToString metóda:
public class ResourceReader {public static String asString (Resource resource) {try (Reader reader = new InputStreamReader (resource.getInputStream (), UTF_8)) {return FileCopyUtils.copyToString (reader); } catch (IOException e) {throw new UncheckedIOException (e); }} // ďalšie metódy obslužného programu}
Existuje mnoho ďalších spôsobov, ako to dosiahnuť, napríklad použitie copyToString jarných StreamUtils trieda
Vytvorme tiež inú metódu úžitku readFileToString, ktorý získa Zdroj pre cestu a zavolajte akoString metóda previesť na a String.
public static String readFileToString (reťazcová cesta) {ResourceLoader resourceLoader = nový DefaultResourceLoader (); Zdroj zdrojov = resourceLoader.getResource (cesta); return asString (zdroj); }
4. Pridanie a Konfigurácia Trieda
Keby každá fazuľa musela vložiť zdroj Strings jednotlivo, existuje šanca na duplikáciu kódu aj na väčšie využitie pamäte fazuľami, ktoré majú svoju vlastnú individuálnu kópiu String.
Čistšie riešenie môžeme dosiahnuť vložením obsahu zdroja do jednej alebo viacerých fazúľ Spring po načítaní kontextu aplikácie. Týmto spôsobom môžeme skryť podrobnosti implementácie na čítanie zdroja pred rôznymi fazuľami, ktoré musia používať tento obsah.
@Configuration verejná trieda LoadResourceConfig {// deklarácia fazule}
4.1. Používanie fazule držiacej reťazec zdrojov
Vyhlásime fazuľu na uchovanie obsahu zdroja v @ Konfigurácia trieda:
@Bean public String resourceString () {return ResourceReader.readFileToString ("resource.txt"); }
Poďme teraz vložiť zaregistrované fazule do polí pridaním znaku @Autowired anotácia:
verejná trieda LoadResourceAsStringIntegrationTest {private static final String EXPECTED_RESOURCE_VALUE = "..."; // Hodnota reťazca obsahu súboru @Autowired @Qualifier ("resourceString") private String resourceString; @Test public void givenUsingResourceStringBean_whenConvertingAResourceToAString_thenCorrect () {assertEquals (EXPECTED_RESOURCE_VALUE, resourceString); }}
V tomto prípade použijeme @Qualifier anotácia a názov fazule, ako možno budeme musieť vložiť viac polí rovnakého typu – String.
Mali by sme poznamenať, že názov fazule použitý v kvalifikátore je odvodený od názvu metódy, ktorá vytvára fazuľa v konfiguračnej triede.
5. Používanie SpEL
Na záver sa pozrime, ako môžeme pomocou jazyka Spring Expression Language opísať kód potrebný na načítanie súboru prostriedkov priamo do poľa v našej triede.
Použime @Hodnota anotácia na vloženie obsahu súboru do poľa resourceStringUsingSpel:
verejná trieda LoadResourceAsStringIntegrationTest {private static final String EXPECTED_RESOURCE_VALUE = "..."; // Reťazcová hodnota obsahu súboru @Value ("# {T (com.baeldung.loadresourceasstring.ResourceReader) .readFileToString ('classpath: resource.txt')}") private String resourceStringUsingSpel; @Test public void givenUsingSpel_whenConvertingAResourceToAString_thenCorrect () {assertEquals (EXPECTED_RESOURCE_VALUE, resourceStringUsingSpel); }}
Tu sme volali ResourceReader # readFileToString popisujúci umiestnenie súboru pomocou a „Classpath:“ -prefixovaná cesta vo vnútri nášho @Hodnota anotácia.
Aby sme znížili množstvo kódu v SpEL, vytvorili sme v triede pomocnú metódu Čítačka zdrojov ktorý používa Apache Commons FileUtils na prístup k súboru z poskytnutej cesty:
public class ResourceReader {public static String readFileToString (String path) throws IOException {return FileUtils.readFileToString (ResourceUtils.getFile (path), StandardCharsets.UTF_8); }}
6. Záver
V tomto tutoriáli sme preskúmali niektoré zo spôsobov, ako previesť zdroj na a String.
Najskôr sme videli, ako vyrobiť a Zdroj prístup k súboru a spôsob čítania z neho Zdroj do String.
Ďalej sme si tiež ukázali, ako skryť implementáciu načítania prostriedkov a umožniť zdieľanie obsahu reťazca medzi fazuľami vytvorením kvalifikovaných fazúľ v @ Konfigurácia, čo umožňuje automatické zapojenie strún.
Nakoniec sme použili SpEL, ktorý poskytuje kompaktné a okamžité riešenie, aj keď si vyžadoval vlastnú pomocnú funkciu, ktorá zabráni tomu, aby sa stala príliš zložitou.
Ako vždy, kód príkladov nájdete na GitHub