2015-12-17 17 views
6

ho bisogno di passare URI del file struttura al seguente metodo (3 ° vaso partito)Come ottenere una posizione URL da un percorso server per un file di proprietà

defaultConfiguration = Factory.createDefaultConfiguration(propertiesUrl.toURI()); 
PayClient client = Factory.createClient(defaultConfiguration); 

Quando schiero il mio codice sull'assistente, ho ottenere questo percorso cioè propertiesUrl.toURI() come abc://localhost/server/test/payment/ConfigLookup.properties

L'applicazione di terzi rifiuta questo valore e non crea la configurazione utilizzata per creare un client di connessione.

Un codice di esempio in cui il file delle proprietà si trova nella mia cartella bin locale funziona correttamente quando viene passato.

Percorso ricevuto come propertiesUrl.toURI()

file:/D:/Code/bin/ConfigLookup.properties 

È possibile che questo crea una connessione.

Gentilmente guidami su cosa manca tra loro. Come far funzionare il codice server in modo simile al funzionamento del codice locale.

+0

Che cos'è lo schema "abc:"? –

+0

In realtà è il server su cui distribuiamo il codice. Post distribuzione, sembra come dire projectname (che ho chiamato come abc) :: //localhost/server/test/payment/ConfigLookup.properties – user2967948

+0

Non è chiaro cosa "rifiuta questo valore" significa, C'è una sorta di errore messaggio o la configurazione semplicemente non viene caricata. Il contenitore di terze parti esegue qualche registrazione? È possibile ottenere qualsiasi registro da esso che potrebbe fornire ulteriori indizi su ciò che sta cercando? –

risposta

0

È possibile ottenere la risorsa tramite classloader e quindi per il file l'URI, vedere here per i dettagli.

+0

Ho ottenuto la risorsa, tuttavia sembra abc: //localhost/server/test/payment/ConfigLookup.properties che il jar di terze parti non accetta come URI valido. – user2967948

1

Apparentemente quel JAR di terze parti si aspetta un URI basato sul file system del disco locale. Questo è in realtà un errore dalla loro parte. È possibile ottenere i contenuti tramite uri.toURL().openStream() senza preoccuparsi del contesto in cui l'URI è effettivamente seduto. Il rifiuto del valore suggerisce che la terza parte stia utilizzando new FileInputStream(new File(uri)) per quello. Prima di tutto, questo dovrebbe essere segnalato dalla loro parte in modo da poterlo correggere correttamente.

Nel frattempo, la soluzione migliore è convertirla in un URI basato sul file system del disco locale, anziché offrire un file system virtuale o un URI basato sul Web. Puoi farlo creando un file temporaneo con l'aiuto di File#createTempFile() nella cartella temporanea gestita dal contenitore, scrivendo il contenuto e infine fornendo il file temporaneo come URI.

Nell'esempio seguente si presume che si sia all'interno di un servlet e quindi si abbia getServletContext() già a portata di mano. Altrimenti, il framework basato su Java EE che si sta utilizzando deve avere la possibilità di fornire/iniettare il ServletContext.

String tempDir = (String) getServletContext().getAttribute(ServletContext.TEMPDIR); 
File tempFile = File.createTempFile("temp-", ".properties", new File(tempDir)); 
Files.copy(propertiesUrl.openStream(), tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING); 
// ... 
defaultConfiguration = Factory.createDefaultConfiguration(tempFile.toURI()); 

Detto questo, siete assolutamente sicuri che questo file proprietà non dovrebbe invece essere posizionato nella cartella /WEB-INF? Al momento è pubblicamente accessibile a chiunque nel mondo abbia un browser web. Vedi anche a.o. Where to place and how to read configuration resource files in servlet based application?

Problemi correlati