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 typuString.

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


$config[zx-auto] not found$config[zx-overlay] not found