Carica una risorsa come stringa in primavera

1. Panoramica

In questo tutorial, esamineremo vari modi per iniettare il contenuto di una risorsa contenente testo come una stringa nei nostri bean Spring .

Vedremo come individuare la risorsa e leggerne il contenuto.

Inoltre, dimostreremo come condividere le risorse caricate tra diversi bean. Lo mostreremo attraverso l'uso di annotazioni relative all'inserimento delle dipendenze, sebbene lo stesso possa essere ottenuto anche utilizzando l'iniezione basata su XML e dichiarando i bean nel file delle proprietà XML.

2. Utilizzo della risorsa

Possiamo semplificare l'individuazione di un file di risorse utilizzando l' interfaccia delle risorse . Spring ci aiuta a trovare e leggere una risorsa utilizzando il caricatore di risorse, che decide quale implementazione delle risorse scegliere in base al percorso fornito. La risorsa è effettivamente un modo per accedere al contenuto della risorsa, piuttosto che al contenuto stesso.

Vediamo alcuni modi per acquisire una risorsa istanza per le risorse nel classpath.

2.1. Utilizzando ResourceLoader

Possiamo usare la classe ResourceLoader se preferiamo usare il caricamento lento:

ResourceLoader resourceLoader = new DefaultResourceLoader(); Resource resource = resourceLoader.getResource("classpath:resource.txt");

Possiamo anche iniettare ResourceLoader nel nostro bean con @Autowired :

@Autowired private ResourceLoader resourceLoader;

2.2 Utilizzo di @Resource

Possiamo iniettare una risorsa direttamente in un bean Spring con @Value :

@Value("classpath:resource.txt") private Resource resource;

3. Conversione da risorsa a stringa

Una volta che abbiamo accesso alla risorsa, dobbiamo essere in grado di leggerla in una stringa . Creiamo una classe di utilità ResourceReader con un metodo statico asString per farlo per noi.

Innanzitutto, dobbiamo acquisire un InputStream :

InputStream inputStream = resource.getInputStream();

Il nostro prossimo passo è prendere questo InputStream e convertirlo in una stringa . Possiamo usare il metodo FileCopyUtils # copyToString di Spring :

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); } } // more utility methods }

Ci sono molti altri modi per raggiungere tale obiettivo, ad esempio, utilizzando copyToString di Spring StreamUtils classe

Creiamo anche un altro metodo di utilità readFileToString, che recupererà la risorsa per un percorso e chiamerà il metodo asString per convertirlo in una stringa .

public static String readFileToString(String path) { ResourceLoader resourceLoader = new DefaultResourceLoader(); Resource resource = resourceLoader.getResource(path); return asString(resource); }

4. Aggiunta di una classe di configurazione

Se ogni bean dovesse iniettare individualmente le String di risorse , c'è la possibilità sia di duplicazione del codice che di un maggiore utilizzo della memoria da parte dei bean che hanno la propria copia individuale della String .

Possiamo ottenere una soluzione più ordinata iniettando il contenuto della risorsa in uno o più bean Spring al caricamento del contesto dell'applicazione. In questo modo, possiamo nascondere i dettagli di implementazione per la lettura della risorsa dai vari bean che devono utilizzare questo contenuto.

@Configuration public class LoadResourceConfig { // Bean Declarations }

4.1. Utilizzando un fagiolo che tiene la stringa della risorsa

Dichiariamo i bean per contenere il contenuto della risorsa in una classe @Configuration :

@Bean public String resourceString() { return ResourceReader.readFileToString("resource.txt"); }

Iniettiamo ora i bean registrati nei campi aggiungendo un'annotazione @Autowired :

public class LoadResourceAsStringIntegrationTest { private static final String EXPECTED_RESOURCE_VALUE = "..."; // The string value of the file content @Autowired @Qualifier("resourceString") private String resourceString; @Test public void givenUsingResourceStringBean_whenConvertingAResourceToAString_thenCorrect() { assertEquals(EXPECTED_RESOURCE_VALUE, resourceString); } }

In questo caso, usiamo l' annotazione @Qualifier e il nome del bean, poiché potrebbe essere necessario iniettare più campi dello stesso tipo - String .

Dobbiamo notare che il nome del bean utilizzato nel qualificatore deriva dal nome del metodo che crea il bean nella classe di configurazione.

5. Utilizzo di SpEL

Infine, vediamo come possiamo utilizzare lo Spring Expression Language per descrivere il codice necessario per caricare un file di risorse direttamente in un campo della nostra classe.

Usiamo l' annotazione @Value per iniettare il contenuto del file nel campo resourceStringUsingSpel :

public class LoadResourceAsStringIntegrationTest { private static final String EXPECTED_RESOURCE_VALUE = "..."; // The string value of the file content @Value( "#{T(com.baeldung.loadresourceasstring.ResourceReader).readFileToString('classpath:resource.txt')}" ) private String resourceStringUsingSpel; @Test public void givenUsingSpel_whenConvertingAResourceToAString_thenCorrect() { assertEquals(EXPECTED_RESOURCE_VALUE, resourceStringUsingSpel); } }

Qui abbiamo chiamato ResourceReader # readFileToString descrivendo la posizione del file utilizzando un "classpath:" - percorso prefissato all'interno della nostra annotazione @Value .

Per ridurre la quantità di codice nello SpEL, abbiamo creato un metodo di supporto nella classe ResourceReader che utilizza Apache Commons FileUtils per accedere al file dal percorso fornito:

public class ResourceReader { public static String readFileToString(String path) throws IOException { return FileUtils.readFileToString(ResourceUtils.getFile(path), StandardCharsets.UTF_8); } }

6. Conclusione

In questo tutorial, abbiamo esaminato alcuni dei modi per convertire una risorsa in una stringa .

Prima di tutto, abbiamo visto come produrre una risorsa per accedere al file e come leggere da risorsa a stringa.

Successivamente, abbiamo anche mostrato come nascondere l'implementazione del caricamento delle risorse e consentire la condivisione del contenuto della stringa tra i bean creando bean qualificati in una @Configuration , consentendo il collegamento automatico delle stringhe.

Infine, abbiamo utilizzato SpEL, che fornisce una soluzione compatta e immediata, sebbene richiedesse una funzione di supporto personalizzata per evitare che diventasse troppo complessa.

Come sempre, il codice per gli esempi può essere trovato su GitHub