<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>admin | www.valeriofinazzo.it</title>
	<atom:link href="http://www.valeriofinazzo.it/wordpress/author/admin/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.valeriofinazzo.it/wordpress</link>
	<description>Il sito dell&#039;ingegnere Valerio Finazzo</description>
	<lastBuildDate>Sat, 25 Feb 2023 17:24:01 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.11</generator>
	<item>
		<title>com.mongodb.MongoTimeoutException: Timed out after 30000 ms</title>
		<link>http://www.valeriofinazzo.it/wordpress/2023/02/com-mongodb-mongotimeoutexception-timed-out-after-30000-ms/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sat, 25 Feb 2023 17:23:34 +0000</pubDate>
				<category><![CDATA[Senza categoria]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=678</guid>

					<description><![CDATA[<p>Nel progetto che sto seguendo adesso in ambito Azure Cloud con il team abbiamo adottatato come soluzione di persistenza Azure Cosmos DB for MongoDB. Per velocizzare gli sviluppi abbiamo integrato Spring, in particolare spring-boot-starter-data-mongodb, per poter utilizzare agevolmente i MongoRepositories e non doverci preoccupare degli strati più bassi dell&#8217;applicativo. Tutto figo, scrittura che va senza &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2023/02/com-mongodb-mongotimeoutexception-timed-out-after-30000-ms/" class="more-link">Continua la lettura di <span class="screen-reader-text">com.mongodb.MongoTimeoutException: Timed out after 30000 ms</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2023/02/com-mongodb-mongotimeoutexception-timed-out-after-30000-ms/">com.mongodb.MongoTimeoutException: Timed out after 30000 ms</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Nel progetto che sto seguendo adesso in ambito Azure Cloud con il team abbiamo adottatato come soluzione di persistenza Azure Cosmos DB for MongoDB. Per velocizzare gli sviluppi abbiamo integrato Spring, in particolare spring-boot-starter-data-mongodb, per poter utilizzare agevolmente i MongoRepositories e non doverci preoccupare degli strati più bassi dell&#8217;applicativo. Tutto figo, scrittura che va senza problemi, fino a quando non decidiamo di fare anche operazioni di lettura e ci scontriamo con questa eccezione oscura:</p>



<p><code data-enlighter-language="generic" class="EnlighterJSRAW">Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector { readPreference= ReadPreference {name=secondary, hedgeOptions=null}}. Client view of cluster state is {type=REPLICA_SET, servers=[{address=<strong><em>*, type=REPLICA_SET_PRIMARY, TagSet{[Tag{name='region', value='</em></strong>'}]}, roundTripTime=199.7 ms, state=CONNECTED}</code></p>



<p>Tutto quello che si trova in rete non ci permette di risolvere perchè non va, fino a quando non rivedo la configurazione adottata con Spring</p>



<pre class="crayon-plain-tag">@Override
protected void configureClientSettings(MongoClientSettings.Builder builder) {        
    builder
        .applyConnectionString(new ConnectionString(mongoUri))              
        .readPreference(ReadPreference.secondary());
}</pre>



<p>E qui finalmente si svela l&#8217;arcano. Essendo un cosmosdb configurato per il dev per limitare i costi non abbiamo attivato la read replica, mentre da nella configurazione avevamo specificato di leggere il secondario che non era stato attivato. L&#8217;eccezione non proprio parlante non ci ha permesso di individuare subito, ma per risolvere agevolmente è stato sufficiente cambiare la configurazione in questo modo</p>



<pre class="crayon-plain-tag">@Override
protected void configureClientSettings(MongoClientSettings.Builder builder) {        
    builder
        .applyConnectionString(new ConnectionString(mongoUri))              
        .readPreference(ReadPreference.primary());
}</pre>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2023%2F02%2Fcom-mongodb-mongotimeoutexception-timed-out-after-30000-ms%2F&amp;linkname=com.mongodb.MongoTimeoutException%3A%20Timed%20out%20after%2030000%20ms" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2023%2F02%2Fcom-mongodb-mongotimeoutexception-timed-out-after-30000-ms%2F&amp;linkname=com.mongodb.MongoTimeoutException%3A%20Timed%20out%20after%2030000%20ms" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2023%2F02%2Fcom-mongodb-mongotimeoutexception-timed-out-after-30000-ms%2F&amp;linkname=com.mongodb.MongoTimeoutException%3A%20Timed%20out%20after%2030000%20ms" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2023%2F02%2Fcom-mongodb-mongotimeoutexception-timed-out-after-30000-ms%2F&amp;linkname=com.mongodb.MongoTimeoutException%3A%20Timed%20out%20after%2030000%20ms" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2023%2F02%2Fcom-mongodb-mongotimeoutexception-timed-out-after-30000-ms%2F&amp;linkname=com.mongodb.MongoTimeoutException%3A%20Timed%20out%20after%2030000%20ms" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2023%2F02%2Fcom-mongodb-mongotimeoutexception-timed-out-after-30000-ms%2F&#038;title=com.mongodb.MongoTimeoutException%3A%20Timed%20out%20after%2030000%20ms" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2023/02/com-mongodb-mongotimeoutexception-timed-out-after-30000-ms/" data-a2a-title="com.mongodb.MongoTimeoutException: Timed out after 30000 ms"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2023/02/com-mongodb-mongotimeoutexception-timed-out-after-30000-ms/">com.mongodb.MongoTimeoutException: Timed out after 30000 ms</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Errore Ionic &#8211; npm ERR! Unexpected token &#8216;.&#8217;</title>
		<link>http://www.valeriofinazzo.it/wordpress/2022/05/errore-ionic-npm-err-unexpected-token/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 29 May 2022 14:05:11 +0000</pubDate>
				<category><![CDATA[MOBILE]]></category>
		<category><![CDATA[ionic]]></category>
		<category><![CDATA[npm]]></category>
		<category><![CDATA[nvm]]></category>
		<guid isPermaLink="false">https://www.valeriofinazzo.it/wordpress/?p=675</guid>

					<description><![CDATA[<p>E&#8217; un errore che riscontro ultimamente lavorando con ionic. Mi capita quando provo ad avanzare lnode dalla versione 16.13.2 ad una versione successiva. Allo stato attuale ho una configurazione funzionante che prevede: Nel momento in cui scrivo sono presenti queste versioni Ma solo la 16.3.2 non presente il problema in oggetto e riporto per comodità &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2022/05/errore-ionic-npm-err-unexpected-token/" class="more-link">Continua la lettura di <span class="screen-reader-text">Errore Ionic &#8211; npm ERR! Unexpected token &#8216;.&#8217;</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2022/05/errore-ionic-npm-err-unexpected-token/">Errore Ionic – npm ERR! Unexpected token ‘.’</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>E&#8217; un errore che riscontro ultimamente lavorando con ionic. Mi capita quando provo ad avanzare lnode dalla versione 16.13.2 ad una versione successiva. Allo stato attuale ho una configurazione funzionante che prevede:</p>



<pre class="crayon-plain-tag">nvm:  '1.1.7'
npm:  '8.1.2'
node: '16.13.2</pre>



<p>Nel momento in cui scrivo sono presenti queste versioni</p>



<pre class="crayon-plain-tag">|   CURRENT    |     LTS      |  OLD STABLE  | OLD UNSTABLE |
|--------------|--------------|--------------|--------------|
|    18.2.0    |   16.15.0    |   0.12.18    |   0.11.16    |
|    18.1.0    |   16.14.2    |   0.12.17    |   0.11.15    |
|    18.0.0    |   16.14.1    |   0.12.16    |   0.11.14    |
|    17.9.0    |   16.14.0    |   0.12.15    |   0.11.13    |
|    17.8.0    |   16.13.2    |   0.12.14    |   0.11.12    |</pre>



<p>Ma solo la 16.3.2 non presente il problema in oggetto e riporto per comodità un estratto del file di log e della console</p>



<pre class="crayon-plain-tag">--console
npm version
npm ERR! Unexpected token '.'

--file di log
28 verbose stack SyntaxError: Unexpected token '.'
28 verbose stack     at Object.compileFunction (node:vm:352:18)
28 verbose stack     at wrapSafe (node:internal/modules/cjs/loader:1033:15)</pre>



<p>Secondo gli amici di Github occorre avanzare nvm ad una versione successiva (1.1.9) e rimuovere e reinstallare la 16.15.0 di node</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F05%2Ferrore-ionic-npm-err-unexpected-token%2F&amp;linkname=Errore%20Ionic%20%E2%80%93%20npm%20ERR%21%20Unexpected%20token%20%E2%80%98.%E2%80%99" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F05%2Ferrore-ionic-npm-err-unexpected-token%2F&amp;linkname=Errore%20Ionic%20%E2%80%93%20npm%20ERR%21%20Unexpected%20token%20%E2%80%98.%E2%80%99" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F05%2Ferrore-ionic-npm-err-unexpected-token%2F&amp;linkname=Errore%20Ionic%20%E2%80%93%20npm%20ERR%21%20Unexpected%20token%20%E2%80%98.%E2%80%99" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F05%2Ferrore-ionic-npm-err-unexpected-token%2F&amp;linkname=Errore%20Ionic%20%E2%80%93%20npm%20ERR%21%20Unexpected%20token%20%E2%80%98.%E2%80%99" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F05%2Ferrore-ionic-npm-err-unexpected-token%2F&amp;linkname=Errore%20Ionic%20%E2%80%93%20npm%20ERR%21%20Unexpected%20token%20%E2%80%98.%E2%80%99" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F05%2Ferrore-ionic-npm-err-unexpected-token%2F&#038;title=Errore%20Ionic%20%E2%80%93%20npm%20ERR%21%20Unexpected%20token%20%E2%80%98.%E2%80%99" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2022/05/errore-ionic-npm-err-unexpected-token/" data-a2a-title="Errore Ionic – npm ERR! Unexpected token ‘.’"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2022/05/errore-ionic-npm-err-unexpected-token/">Errore Ionic – npm ERR! Unexpected token ‘.’</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>RestTemplate &#8211; Gestire contenuto Multipart-mixed</title>
		<link>http://www.valeriofinazzo.it/wordpress/2022/05/resttemplate-gestire-contenuto-multipart-mixed/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Wed, 25 May 2022 17:21:31 +0000</pubDate>
				<category><![CDATA[SPRING BOOT]]></category>
		<category><![CDATA[resttemplate]]></category>
		<category><![CDATA[spring]]></category>
		<guid isPermaLink="false">https://www.valeriofinazzo.it/wordpress/?p=670</guid>

					<description><![CDATA[<p>In questi giorni mi sono trovato a dover gestire il contenuto di servizio rest che a seguito di una chiamata GET restituiva un content di tipo multipart-mixed. Nel progetto precedente usavo jersey che gestiva in mod del tutto trasparente questo tipo di chiamata, in questo progetto avevo una dipendenza da Spring ed ero vincolato ad &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2022/05/resttemplate-gestire-contenuto-multipart-mixed/" class="more-link">Continua la lettura di <span class="screen-reader-text">RestTemplate &#8211; Gestire contenuto Multipart-mixed</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2022/05/resttemplate-gestire-contenuto-multipart-mixed/">RestTemplate – Gestire contenuto Multipart-mixed</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>In questi giorni mi sono trovato a dover gestire il contenuto di servizio rest che a seguito  di una chiamata GET restituiva un content di tipo multipart-mixed. Nel progetto precedente usavo jersey che gestiva in mod del tutto trasparente questo tipo di chiamata, in questo progetto avevo una dipendenza da Spring ed ero vincolato ad usare la classe RestTemplate, peccato che per questa template la lettura di questo tipo di contenuto non fosse così agevole.</p>



<p>Per risolvere ho letto la risposta come byte[]  e poi ho usato la classe org.apache.commons.fileupload.MultipartStream presente nel in <a href="https://commons.apache.org/proper/commons-fileupload/" target="_blank" rel="noreferrer noopener" title="Commons FileUpload">Commons FileUpload</a> per leggere il contenuto da un byte[], scartare gli header e leggere solo il file di mio interesse</p>



<pre class="crayon-plain-tag">RestTemplate restTemplate = new RestTemplate();
byte[] bytes = restTemplate.getForObject(fileUlr, byte[].class);
String txt = new String(bytes);
String boundary = StringUtils.substringBefore(txt, &quot;\r\n&quot;).substring(2);
MultipartStream multipartStream = new MultipartStream(new ByteArrayInputStream(bytes), 
		boundary.getBytes(), 1024, null);
boolean nextPart = multipartStream.skipPreamble();
while (nextPart) {
     	multipartStream.readHeaders();
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        multipartStream.readBodyData(bos);
        return bos.toByteArray();
}
return bytes;</pre>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F05%2Fresttemplate-gestire-contenuto-multipart-mixed%2F&amp;linkname=RestTemplate%20%E2%80%93%20Gestire%20contenuto%20Multipart-mixed" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F05%2Fresttemplate-gestire-contenuto-multipart-mixed%2F&amp;linkname=RestTemplate%20%E2%80%93%20Gestire%20contenuto%20Multipart-mixed" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F05%2Fresttemplate-gestire-contenuto-multipart-mixed%2F&amp;linkname=RestTemplate%20%E2%80%93%20Gestire%20contenuto%20Multipart-mixed" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F05%2Fresttemplate-gestire-contenuto-multipart-mixed%2F&amp;linkname=RestTemplate%20%E2%80%93%20Gestire%20contenuto%20Multipart-mixed" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F05%2Fresttemplate-gestire-contenuto-multipart-mixed%2F&amp;linkname=RestTemplate%20%E2%80%93%20Gestire%20contenuto%20Multipart-mixed" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F05%2Fresttemplate-gestire-contenuto-multipart-mixed%2F&#038;title=RestTemplate%20%E2%80%93%20Gestire%20contenuto%20Multipart-mixed" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2022/05/resttemplate-gestire-contenuto-multipart-mixed/" data-a2a-title="RestTemplate – Gestire contenuto Multipart-mixed"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2022/05/resttemplate-gestire-contenuto-multipart-mixed/">RestTemplate – Gestire contenuto Multipart-mixed</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SPRING-BOOT &#8211; FileNotFoundException: class path resource cannot be resolved to absolute file path because it does not reside in the file system:  jar:file:*</title>
		<link>http://www.valeriofinazzo.it/wordpress/2022/02/spring-boot-filenotfoundexception-class-path-resource-cannot-be-resolved-to-absolute-file-path-because-it-does-not-reside-in-the-file-system-jarfile/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sat, 05 Feb 2022 13:49:45 +0000</pubDate>
				<category><![CDATA[Senza categoria]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=662</guid>

					<description><![CDATA[<p>Personalmente reputo jasper reports un prodotto ottimo, permette di elaborare report di elevata complessità permettendo di concentrarsi sugli aspetti più importanti come la presentazione senza aver bisogno di una conoscenza approfondita di librerie per gestire i vari formati pfg, xls, csv, &#8230; Lo stack tecnologico si evolve con il tempo e capita che soluzioni adottate &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2022/02/spring-boot-filenotfoundexception-class-path-resource-cannot-be-resolved-to-absolute-file-path-because-it-does-not-reside-in-the-file-system-jarfile/" class="more-link">Continua la lettura di <span class="screen-reader-text">SPRING-BOOT &#8211; FileNotFoundException: class path resource cannot be resolved to absolute file path because it does not reside in the file system:  jar:file:*</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2022/02/spring-boot-filenotfoundexception-class-path-resource-cannot-be-resolved-to-absolute-file-path-because-it-does-not-reside-in-the-file-system-jarfile/">SPRING-BOOT – FileNotFoundException: class path resource cannot be resolved to absolute file path because it does not reside in the file system:  jar:file:*</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Personalmente reputo jasper reports un prodotto ottimo, permette di elaborare report di elevata complessità permettendo di concentrarsi sugli aspetti più importanti come la presentazione senza aver bisogno di una conoscenza approfondita di librerie per gestire i vari formati pfg, xls, csv, &#8230;</p>



<p>Lo stack tecnologico si evolve con il tempo e capita che soluzioni adottate precedentemente non siano più percorribili. E&#8217; il caso di jasper report e spring boot. Spring boot, altro prodotto validissimo, ci permette di generare dei jar eseguibili che tramite l&#8217;uso dei tomcat embedded ci permette di tirare dei servizi web senza particolari problemi. Non hai più la necessità di gestire una istanza tomcat, e di generare il war che va installata su di essa, ma generi un jar che eseguito espone il servizio richiesto. Se all&#8217;interno del jar prevediamo la presenza dei template jasper per l&#8217;elaborazione del report occorre non più fornire il path ma fornire questo template sotto forma di inputstream. Su questo argomento avevo già scritto un articolo che trovate <a href="http://www.valeriofinazzo.it/wordpress/2020/04/spring-boot-java-io-filenotfoundexception-class-path-resource/" target="_blank" rel="noreferrer noopener" title="qui">qui</a>.</p>



<p>In questi giorni  però mi è capitato di dover gestire un report che a suo volta conteneva un subreport passato sotto forma di path ed ecco che si  è ripresentata di nuovo l&#8217;eccezione FILENOTFOUNDEXCEPTION, perchè giustamente anche il subreport va passato come inpustream per risolvere il problema.</p>



<p>Ricapitolando:</p>



<p>In JasperReport definisco un parametro di tipo inputstream</p>



<figure class="wp-block-image size-full is-resized"><a href="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/02/image.png"><img src="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/02/image.png" alt="" class="wp-image-663" width="453" height="236" srcset="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/02/image.png 343w, http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/02/image-300x157.png 300w" sizes="(max-width: 453px) 100vw, 453px" /></a></figure>



<p>Lo utilizzo come espressione del subreport</p>



<figure class="wp-block-image size-full"><a href="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/02/image-1.png"><img loading="lazy" width="591" height="354" src="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/02/image-1.png" alt="" class="wp-image-664" srcset="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/02/image-1.png 591w, http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/02/image-1-300x180.png 300w" sizes="(max-width: 591px) 100vw, 591px" /></a></figure>



<p>E nella classe java dove invoco il metodo per la generazione del report lo passo come parametro</p>



<p><code data-enlighter-language="java" class="EnlighterJSRAW">params.put("SUBREPORT_INPUTSTREAM", report.getInputStream());</code></p>



<p>Buon lavoro</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F02%2Fspring-boot-filenotfoundexception-class-path-resource-cannot-be-resolved-to-absolute-file-path-because-it-does-not-reside-in-the-file-system-jarfile%2F&amp;linkname=SPRING-BOOT%20%E2%80%93%20FileNotFoundException%3A%20class%20path%20resource%20cannot%20be%20resolved%20to%20absolute%20file%20path%20because%20it%20does%20not%20reside%20in%20the%20file%20system%3A%20%20jar%3Afile%3A%2A" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F02%2Fspring-boot-filenotfoundexception-class-path-resource-cannot-be-resolved-to-absolute-file-path-because-it-does-not-reside-in-the-file-system-jarfile%2F&amp;linkname=SPRING-BOOT%20%E2%80%93%20FileNotFoundException%3A%20class%20path%20resource%20cannot%20be%20resolved%20to%20absolute%20file%20path%20because%20it%20does%20not%20reside%20in%20the%20file%20system%3A%20%20jar%3Afile%3A%2A" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F02%2Fspring-boot-filenotfoundexception-class-path-resource-cannot-be-resolved-to-absolute-file-path-because-it-does-not-reside-in-the-file-system-jarfile%2F&amp;linkname=SPRING-BOOT%20%E2%80%93%20FileNotFoundException%3A%20class%20path%20resource%20cannot%20be%20resolved%20to%20absolute%20file%20path%20because%20it%20does%20not%20reside%20in%20the%20file%20system%3A%20%20jar%3Afile%3A%2A" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F02%2Fspring-boot-filenotfoundexception-class-path-resource-cannot-be-resolved-to-absolute-file-path-because-it-does-not-reside-in-the-file-system-jarfile%2F&amp;linkname=SPRING-BOOT%20%E2%80%93%20FileNotFoundException%3A%20class%20path%20resource%20cannot%20be%20resolved%20to%20absolute%20file%20path%20because%20it%20does%20not%20reside%20in%20the%20file%20system%3A%20%20jar%3Afile%3A%2A" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F02%2Fspring-boot-filenotfoundexception-class-path-resource-cannot-be-resolved-to-absolute-file-path-because-it-does-not-reside-in-the-file-system-jarfile%2F&amp;linkname=SPRING-BOOT%20%E2%80%93%20FileNotFoundException%3A%20class%20path%20resource%20cannot%20be%20resolved%20to%20absolute%20file%20path%20because%20it%20does%20not%20reside%20in%20the%20file%20system%3A%20%20jar%3Afile%3A%2A" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F02%2Fspring-boot-filenotfoundexception-class-path-resource-cannot-be-resolved-to-absolute-file-path-because-it-does-not-reside-in-the-file-system-jarfile%2F&#038;title=SPRING-BOOT%20%E2%80%93%20FileNotFoundException%3A%20class%20path%20resource%20cannot%20be%20resolved%20to%20absolute%20file%20path%20because%20it%20does%20not%20reside%20in%20the%20file%20system%3A%20%20jar%3Afile%3A%2A" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2022/02/spring-boot-filenotfoundexception-class-path-resource-cannot-be-resolved-to-absolute-file-path-because-it-does-not-reside-in-the-file-system-jarfile/" data-a2a-title="SPRING-BOOT – FileNotFoundException: class path resource cannot be resolved to absolute file path because it does not reside in the file system:  jar:file:*"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2022/02/spring-boot-filenotfoundexception-class-path-resource-cannot-be-resolved-to-absolute-file-path-because-it-does-not-reside-in-the-file-system-jarfile/">SPRING-BOOT – FileNotFoundException: class path resource cannot be resolved to absolute file path because it does not reside in the file system:  jar:file:*</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ERRORE &#8211; Plugin execution not covered by lifecycle configuration</title>
		<link>http://www.valeriofinazzo.it/wordpress/2022/01/errore-plugin-execution-not-covered-by-lifecycle-configuration/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 20 Jan 2022 17:26:44 +0000</pubDate>
				<category><![CDATA[VARIE]]></category>
		<category><![CDATA[ECLIPSE]]></category>
		<category><![CDATA[STS]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=649</guid>

					<description><![CDATA[<p>Oggi vediamo un problema in cui mi sono imbattuto recentemente. Importando un progetto maven in Spring Tool Suite 4 (STS) a fine processo l&#8217;IDE mostrava un fastidioso messaggio rosso Sostanzialmente il messaggio indicava che uno dei vari plugin configurati nella build del processo non era gestito correttamente nel ciclio di vita gestito da STS. Nel &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2022/01/errore-plugin-execution-not-covered-by-lifecycle-configuration/" class="more-link">Continua la lettura di <span class="screen-reader-text">ERRORE &#8211; Plugin execution not covered by lifecycle configuration</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2022/01/errore-plugin-execution-not-covered-by-lifecycle-configuration/">ERRORE – Plugin execution not covered by lifecycle configuration</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Oggi vediamo un problema in cui mi sono imbattuto recentemente. Importando un progetto maven in Spring Tool Suite 4 (STS) a fine processo l&#8217;IDE mostrava un fastidioso messaggio rosso</p>



<figure class="wp-block-image size-large"><a href="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-6.png"><img loading="lazy" width="1024" height="56" src="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-6-1024x56.png" alt="" class="wp-image-658" srcset="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-6-1024x56.png 1024w, http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-6-300x16.png 300w, http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-6-768x42.png 768w, http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-6.png 1168w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption>Errore su STS</figcaption></figure>



<p>Sostanzialmente il messaggio indicava che uno dei vari plugin configurati nella build del processo non era gestito correttamente nel ciclio di vita gestito da STS. Nel mio caso si trattava del plugin jasperreports-plugin responsabile della compilazione dei file .jrxml in file.jasper e la condizione di errore veniva indicata sul tag execution</p>



<figure class="wp-block-image size-full"><a href="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-5.png"><img loading="lazy" width="864" height="483" src="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-5.png" alt="" class="wp-image-657" srcset="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-5.png 864w, http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-5-300x168.png 300w, http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-5-768x429.png 768w" sizes="(max-width: 864px) 100vw, 864px" /></a><figcaption>plugin che da il problema</figcaption></figure>



<p>Per gestire l&#8217;errore è stato sufficiente sfruttare un&#8217;altra feature del maven, ovvero il dependency management e definire tramite un altro plugin (lifecycle-mapping) il comportamento di Eclipse. Il dependency managament è un tag disponibile all&#8217;interno del tag build.</p>



<figure class="wp-block-image size-full"><a href="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-4.png"><img loading="lazy" width="504" height="462" src="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-4.png" alt="" class="wp-image-656" srcset="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-4.png 504w, http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-4-300x275.png 300w" sizes="(max-width: 504px) 100vw, 504px" /></a><figcaption>configurazione che risolve lanciando l&#8217;esecuzione</figcaption></figure>



<p>Una volta aggiornato il pom, STS ha rimosso l&#8217;errore, compilato i file e generato i file jasper attesi.</p>



<p>E&#8217; possibile configurare lo stesso plugin anche per ignorare il plugin incriminato all&#8217;interno della gestione di STS, in questo caso invece di usare l&#8217;action execute si usa l&#8217;action ignore</p>



<figure class="wp-block-image size-full"><a href="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-3.png"><img loading="lazy" width="516" height="433" src="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-3.png" alt="" class="wp-image-655" srcset="http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-3.png 516w, http://www.valeriofinazzo.it/wordpress/wp-content/uploads/2022/01/image-3-300x252.png 300w" sizes="(max-width: 516px) 100vw, 516px" /></a><figcaption> configurazione che risolve ignorando l&#8217;esecuzione </figcaption></figure>



<p>Per maggiori informazioni vi invito a leggere la documentazione ufficiale disponibile qui, mentre per l&#8217;ottimo plugin di compilazione di report la pagina ufficiale è questa.</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F01%2Ferrore-plugin-execution-not-covered-by-lifecycle-configuration%2F&amp;linkname=ERRORE%20%E2%80%93%20Plugin%20execution%20not%20covered%20by%20lifecycle%20configuration" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F01%2Ferrore-plugin-execution-not-covered-by-lifecycle-configuration%2F&amp;linkname=ERRORE%20%E2%80%93%20Plugin%20execution%20not%20covered%20by%20lifecycle%20configuration" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F01%2Ferrore-plugin-execution-not-covered-by-lifecycle-configuration%2F&amp;linkname=ERRORE%20%E2%80%93%20Plugin%20execution%20not%20covered%20by%20lifecycle%20configuration" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F01%2Ferrore-plugin-execution-not-covered-by-lifecycle-configuration%2F&amp;linkname=ERRORE%20%E2%80%93%20Plugin%20execution%20not%20covered%20by%20lifecycle%20configuration" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F01%2Ferrore-plugin-execution-not-covered-by-lifecycle-configuration%2F&amp;linkname=ERRORE%20%E2%80%93%20Plugin%20execution%20not%20covered%20by%20lifecycle%20configuration" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2022%2F01%2Ferrore-plugin-execution-not-covered-by-lifecycle-configuration%2F&#038;title=ERRORE%20%E2%80%93%20Plugin%20execution%20not%20covered%20by%20lifecycle%20configuration" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2022/01/errore-plugin-execution-not-covered-by-lifecycle-configuration/" data-a2a-title="ERRORE – Plugin execution not covered by lifecycle configuration"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2022/01/errore-plugin-execution-not-covered-by-lifecycle-configuration/">ERRORE – Plugin execution not covered by lifecycle configuration</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GOLANG &#8211; LEGGERE ARCHIVI</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-leggere-archivi/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 25 Oct 2020 16:48:28 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[zip]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=645</guid>

					<description><![CDATA[<p>Dopo aver visto come creare dei file zip vediamo come poter effettuare la lettura e lo spacchettamento di un file zip. Ipotizziamo di avere un file zip sotto la directory download, vogliamo leggerlo e scompattarlo nella directory dove lanciamo la routine go. A questo punto creiamo una directory rdt con permessi di scrittura Infine scorriamo &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-leggere-archivi/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GOLANG &#8211; LEGGERE ARCHIVI</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-leggere-archivi/">TUTORIAL GOLANG – LEGGERE ARCHIVI</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Dopo aver visto come creare dei file zip vediamo come poter effettuare la lettura e lo spacchettamento di un file zip.</p>



<p>Ipotizziamo di avere un file zip sotto la directory download, vogliamo leggerlo e scompattarlo nella directory dove lanciamo la routine go.</p>



<pre class="crayon-plain-tag">reader, err := zip.OpenReader(&quot;C:\\Users\\Valerio\\Downloads\\rdt.zip&quot;)
	if err != nil {
		fmt.Println(&quot;Errore: &quot;, err)
	}</pre>



<p>A questo punto creiamo una directory rdt con permessi di scrittura</p>



<pre class="crayon-plain-tag">err = os.Mkdir(&quot;rdt&quot;, 0755)
	if err != nil {
		fmt.Println(&quot;Errore: &quot;, err)
	}</pre>



<p>Infine scorriamo l&#8217;elenco dei file presenti all&#8217;interno dello zip, li leggiamo e li copiamo all&#8217;interno della directory appena generata</p>



<pre class="crayon-plain-tag">fileszip := reader.File
	for _, fil := range fileszip {
		singlereader, _ := fil.Open()
		newpath := filepath.Join(&quot;rdt&quot;, fil.Name)
		newfile, _ := os.Create(newpath)
		io.Copy(bufio.NewWriter(newfile), singlereader)
	}</pre>



<p>In questo esempio di nuovo vediamo il pakage filepath che ci permette di costruire dei percorsi sul file system con la function Join che concatena i percorsi ricevuti.</p>



<p>Alla prossima</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F10%2Ftutorial-golang-leggere-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20LEGGERE%20ARCHIVI" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F10%2Ftutorial-golang-leggere-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20LEGGERE%20ARCHIVI" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F10%2Ftutorial-golang-leggere-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20LEGGERE%20ARCHIVI" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F10%2Ftutorial-golang-leggere-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20LEGGERE%20ARCHIVI" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F10%2Ftutorial-golang-leggere-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20LEGGERE%20ARCHIVI" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F10%2Ftutorial-golang-leggere-archivi%2F&#038;title=TUTORIAL%20GOLANG%20%E2%80%93%20LEGGERE%20ARCHIVI" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-leggere-archivi/" data-a2a-title="TUTORIAL GOLANG – LEGGERE ARCHIVI"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-leggere-archivi/">TUTORIAL GOLANG – LEGGERE ARCHIVI</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GOLANG &#8211; GENERARE ARCHIVI</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-gestire-archivi/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 04 Oct 2020 15:59:53 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[tar]]></category>
		<category><![CDATA[zip]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=640</guid>

					<description><![CDATA[<p>Golang mette a disposizione i package tar e zip per gestire le operazioni comuni di creazione archivi e la loro compressione. Il package tar consente di raggruppare in un unico file tutti i file contenuti in una directory mentre il package zip consente di effettuare la compressione dei dati. Vediamo come creare un tar e &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-gestire-archivi/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GOLANG &#8211; GENERARE ARCHIVI</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-gestire-archivi/">TUTORIAL GOLANG – GENERARE ARCHIVI</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Golang mette a disposizione i package tar e zip per gestire le operazioni comuni di creazione archivi e la loro compressione. Il package tar consente di raggruppare in un unico file tutti i file contenuti in una directory mentre il package zip consente di effettuare la compressione dei dati.</p>



<p>Vediamo come creare un tar e un file zip. In particolare consideriamo una cartella e mettiamo il contenuto della cartella in un file tar e in un file zip</p>



<pre class="crayon-plain-tag">package main

import (
	&quot;archive/tar&quot;
	&quot;archive/zip&quot;
	&quot;fmt&quot;
	&quot;io/ioutil&quot;
	&quot;os&quot;
)

func main() {
	fmt.Println(&quot;Start&quot;)

	filetar, err := os.Create(&quot;../mytar.tar&quot;)
	filezip, err := os.Create(&quot;../mytar.zip&quot;)

	if err != nil {
		fmt.Println(&quot;Errore: &quot;, err)
	}
	writerTar := tar.NewWriter(filetar)
	writerZip := zip.NewWriter(filezip)

	defer writerTar.Close()
	defer writerZip.Close()

	files, err := ioutil.ReadDir(&quot;.&quot;)
	for _, singlefile := range files {
		if !singlefile.IsDir() {
			content, _ := ioutil.ReadFile(singlefile.Name())
			hdr := &amp;amp;tar.Header{
				Name: singlefile.Name(),
				Size: singlefile.Size(),
			}
			err = writerTar.WriteHeader(hdr)
			writerTar.Write(content)

			wr, _ := writerZip.Create(singlefile.Name())
			wr.Write(content)
		}
	}

	fmt.Println(&quot;End&quot;)
}</pre>



<p>Tramite la fucntion Create creo sia il file tar che il file zip e per ognuno di essi genero un writer. Tramite il comando defer mi assicuro che la chiusura del writer venga effettuato alla fine di tutti i miei comandi.</p>



<p>Tramite la funcion readDir recupero tutti i file della directory corrente, genero l&#8217;header per il tar che inizializzo con il nome e la size del file che sto provessando e finalmente posso scrivere tramite il writer sia l&#8217;header che il contenuto del file.</p>



<p>Per lo zip il giro è ancora più semplice perchè non è obbligatorio il passaggio dell&#8217;header.</p>



<p>Nel prossimo articolo vedremo come leggere e recuperare i dati dai miei archivi.</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F10%2Ftutorial-golang-gestire-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20GENERARE%20ARCHIVI" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F10%2Ftutorial-golang-gestire-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20GENERARE%20ARCHIVI" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F10%2Ftutorial-golang-gestire-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20GENERARE%20ARCHIVI" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F10%2Ftutorial-golang-gestire-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20GENERARE%20ARCHIVI" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F10%2Ftutorial-golang-gestire-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20GENERARE%20ARCHIVI" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F10%2Ftutorial-golang-gestire-archivi%2F&#038;title=TUTORIAL%20GOLANG%20%E2%80%93%20GENERARE%20ARCHIVI" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-gestire-archivi/" data-a2a-title="TUTORIAL GOLANG – GENERARE ARCHIVI"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-gestire-archivi/">TUTORIAL GOLANG – GENERARE ARCHIVI</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GOLANG &#8211; ESEGUIRE CHIAMATE HTTP</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-golang-eseguire-chiamate-http/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 27 Sep 2020 19:49:13 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[certificato]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[proxy]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=638</guid>

					<description><![CDATA[<p>L&#8217;articolo illustra come fare delle chiamate http tramite go. Il package che offre le funzioni per gestire il protocollo http si chiama &#8220;net/http&#8221;. Vediamo subito come gestire i principali casi d&#8217;uso. Per effettuare una GET si usa la funzione get, che restituisce un oggetto Response e un oggetto Error. Nell&#8217;esempio sto invocando la homepage di &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-golang-eseguire-chiamate-http/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GOLANG &#8211; ESEGUIRE CHIAMATE HTTP</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-golang-eseguire-chiamate-http/">TUTORIAL GOLANG – ESEGUIRE CHIAMATE HTTP</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>L&#8217;articolo illustra come fare delle chiamate http tramite go. Il package che offre le funzioni per gestire il protocollo http si chiama &#8220;net/http&#8221;. Vediamo subito come gestire i principali casi d&#8217;uso. </p>



<p>Per effettuare una GET si usa la funzione get, che restituisce un oggetto Response e  un oggetto Error.</p>



<pre class="crayon-plain-tag">response, err := http.Get(&quot;http://www.google.it&quot;)
	if err != nil {
		panic(err)
	}
	defer response.Body.Close()
	fmt.Println(&quot;Response status:&quot;, response.Status)
	body, err := ioutil.ReadAll(response.Body)
	fmt.Println(&quot;Response body:&quot;, string(body))</pre>



<p>Nell&#8217;esempio sto invocando la homepage di google, e verifico la presenza di errore e il codice restituito dalla risposta. Successivamente tramite  il package ioutil recupero il body della response e lo stampo  a video.</p>



<p>Se invece volessi inviare una post Golang mette a disposizione  2 funzioni: post e postForm. </p>



<p>La funzione post riceve in ingresso l&#8217;url cui inviare la post, il content type del dato che sto inviando e un reader del package io</p>



<pre class="crayon-plain-tag">response, err = http.Post(&quot;http://www.google.it&quot;, &quot;image/jpeg&quot;, bytes.NewBufferString(&quot;prova&quot;))
	if err != nil {
		panic(err)
	}
	fmt.Println(&quot;Response status:&quot;, response.Status)</pre>



<p>La funzione postForm invece riceve in ingresso l&#8217;url cui inviare la post e il form dei dati chiave, valore</p>



<p>Le 3 funzioni consentono di inviare get e post, ma qualora volessi usare altri metodi come la put o la delete occorre usare il metodo addNewRequest per creare una request e usare il client http per inviare la richiesta.</p>



<pre class="crayon-plain-tag">request, err := http.NewRequest(http.MethodDelete, &quot;http://www.google.it&quot;, bytes.NewBufferString(&quot;prova&quot;))
	if err != nil {
		panic(err)
	}
	client := &amp;amp;http.Client{}
	response, err = client.Do(request)
	if err != nil {
		panic(err)
	}
	fmt.Println(&quot;Response status:&quot;, response.Status)</pre>



<p>Per gestire le caratteristiche avanzate delle connessioni Go mette a disposizione l&#8217;oggetto Transport che opportunamente configurato consente di definire un proxy per l&#8217;invocazione del servizio. Questo caso si presenta quando il nostro client è presente all&#8217;interno di una rete il cui accesso ad internet è veicolato dalla presenza di un proxy.</p>



<pre class="crayon-plain-tag">proxyUrl, err := url.Parse(&quot;http://user:password@127.0.0.1:3128&quot;)
	if err != nil {
		panic(err)
	}
	tr := &amp;amp;http.Transport{
		MaxIdleConns:       10,
		IdleConnTimeout:    30 * time.Second,
		DisableCompression: true,
		Proxy:              http.ProxyURL(proxyUrl),
	}
	client = &amp;amp;http.Client{Transport: tr}
	response, err = client.Do(request)
	if err != nil {
		panic(err)
	}
	fmt.Println(&quot;Response status:&quot;, response.Status)</pre>



<p>Qualora invece il nostro server voglia un certificato occorre caricare il certificato e configurato sempre nel transport affinchè venga usato in trasmissione</p>



<pre class="crayon-plain-tag">caCert, err := ioutil.ReadFile(&quot;miocertificato.crt&quot;)
	if err != nil {
		log.Fatal(err)
	}
	caCertPool := x509.NewCertPool()
	caCertPool.AppendCertsFromPEM(caCert)
	tr := &amp;amp;http.Transport{
		MaxIdleConns:       10,
		IdleConnTimeout:    30 * time.Second,
		DisableCompression: true,
		TLSClientConfig: &amp;amp;tls.Config{
			RootCAs: caCertPool,
		},
	}
	client = &amp;amp;http.Client{Transport: tr}</pre>



<p>Nell&#8217;esempio sto leggendo il certificato e lo sto configurando all&#8217;interno del transport per poi fornirlo al client.</p>



<p>Abbiamo quindi visto come invocare i vari metodi e come gestire una rete con proxy e una connessione crittografata con invio del certificato.</p>



<p>Alla prossima</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-golang-eseguire-chiamate-http%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20ESEGUIRE%20CHIAMATE%20HTTP" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-golang-eseguire-chiamate-http%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20ESEGUIRE%20CHIAMATE%20HTTP" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-golang-eseguire-chiamate-http%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20ESEGUIRE%20CHIAMATE%20HTTP" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-golang-eseguire-chiamate-http%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20ESEGUIRE%20CHIAMATE%20HTTP" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-golang-eseguire-chiamate-http%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20ESEGUIRE%20CHIAMATE%20HTTP" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-golang-eseguire-chiamate-http%2F&#038;title=TUTORIAL%20GOLANG%20%E2%80%93%20ESEGUIRE%20CHIAMATE%20HTTP" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-golang-eseguire-chiamate-http/" data-a2a-title="TUTORIAL GOLANG – ESEGUIRE CHIAMATE HTTP"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-golang-eseguire-chiamate-http/">TUTORIAL GOLANG – ESEGUIRE CHIAMATE HTTP</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SPRING-BOOT &#8211; CONFIGURARE PROXY  e CERTIFICATI PER SERVIZI SOAP</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/09/spring-boot-configurare-proxy-e-certificati-per-servizi-soap/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 20 Sep 2020 10:42:38 +0000</pubDate>
				<category><![CDATA[SPRING BOOT]]></category>
		<category><![CDATA[httpclient]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[spring boot]]></category>
		<category><![CDATA[webservicetemplate]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=636</guid>

					<description><![CDATA[<p>Spring ws è un pacchetto messo a disposizione da Spring per gestire agevolmente la comunicazione tra servizi SOAP. La libreria consente di configurare agevolmente un server soap che riceve chiamate nel rispetto di uno schema definito dall&#8217;utente. Per maggiori informazioni rimando all&#8217;ottimo tutorial realizzato dai ragazzi di spring e che trovate qui Inoltre la libreria &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/09/spring-boot-configurare-proxy-e-certificati-per-servizi-soap/" class="more-link">Continua la lettura di <span class="screen-reader-text">SPRING-BOOT &#8211; CONFIGURARE PROXY  e CERTIFICATI PER SERVIZI SOAP</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/spring-boot-configurare-proxy-e-certificati-per-servizi-soap/">SPRING-BOOT – CONFIGURARE PROXY  e CERTIFICATI PER SERVIZI SOAP</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Spring ws è un pacchetto messo a disposizione da Spring per gestire agevolmente la comunicazione tra servizi SOAP.  La libreria consente di configurare agevolmente un server soap che riceve chiamate nel rispetto di uno schema definito dall&#8217;utente. Per maggiori informazioni rimando all&#8217;ottimo tutorial realizzato dai ragazzi di spring e che trovate <a href="https://spring.io/guides/gs/producing-web-service/" title="esporre un web service">qui</a></p>



<p>Inoltre la libreria consente di configurare agevolmente un client per poter invocare dei servizi esposti su un altro server e sulla configurazione base rimando sempre al tutorial di spring che trovate qui.</p>



<p>In questo articolo approfondiamo come configurare il client che gira all&#8217;interno di una rete con proxy e che richiede lo scambio dei certificati con il server su cui sono esposti i servizi soa.</p>



<p>Il nostro client si trova in una rete con 2 livelli di sicurezza: un proxy che regola il traffico verso l&#8217;esterno della nostra rete e un server che accetta chiamate crittografate con un certificato associato.</p>



<p>Per fare questo dobbiamo configurare il messagesender presente nella classe WebServiceTemplate con una istanza della classe <a href="eclipse-javadoc:%E2%98%82=contrp.be-springboot-trunk/C:%5C/Users%5C/Valerio%5C/.m2%5C/repository%5C/org%5C/springframework%5C/ws%5C/spring-ws-core%5C/3.0.8.RELEASE%5C/spring-ws-core-3.0.8.RELEASE.jar%3Corg">org</a>.<a href="eclipse-javadoc:%E2%98%82=contrp.be-springboot-trunk/C:%5C/Users%5C/Valerio%5C/.m2%5C/repository%5C/org%5C/springframework%5C/ws%5C/spring-ws-core%5C/3.0.8.RELEASE%5C/spring-ws-core-3.0.8.RELEASE.jar%3Corg.springframework">springframework</a>.<a href="eclipse-javadoc:%E2%98%82=contrp.be-springboot-trunk/C:%5C/Users%5C/Valerio%5C/.m2%5C/repository%5C/org%5C/springframework%5C/ws%5C/spring-ws-core%5C/3.0.8.RELEASE%5C/spring-ws-core-3.0.8.RELEASE.jar%3Corg.springframework.ws">ws</a>.<a href="eclipse-javadoc:%E2%98%82=contrp.be-springboot-trunk/C:%5C/Users%5C/Valerio%5C/.m2%5C/repository%5C/org%5C/springframework%5C/ws%5C/spring-ws-core%5C/3.0.8.RELEASE%5C/spring-ws-core-3.0.8.RELEASE.jar%3Corg.springframework.ws.transport">transport</a>.<a href="eclipse-javadoc:%E2%98%82=contrp.be-springboot-trunk/C:%5C/Users%5C/Valerio%5C/.m2%5C/repository%5C/org%5C/springframework%5C/ws%5C/spring-ws-core%5C/3.0.8.RELEASE%5C/spring-ws-core-3.0.8.RELEASE.jar%3Corg.springframework.ws.transport.http">http</a>.HttpComponentsMessageSender che utilizza la classe Apache HttpClient per l&#8217;invio di Post.</p>



<pre class="crayon-plain-tag">HttpComponentsMessageSender httpComponentsMessageSender = httpComponentsMessageSender();
        httpComponentsMessageSender.setHttpClient(httpClient());
		client.setMessageSender(httpComponentsMessageSender);</pre>



<p>Nella classe client sto settando  il message sender tramite un metodo seguente in configuro i tempi di timeout e a questo passo il client httoClient dove effettivamente configuro il proxy e il certificato</p>



<pre class="crayon-plain-tag">@Bean
public HttpComponentsMessageSender httpComponentsMessageSender() {     
    HttpComponentsMessageSender sender = new HttpComponentsMessageSender();
    sender.setReadTimeout(3000);
    sender.setConnectionTimeout(3000);
    return sender;
}</pre>



<pre class="crayon-plain-tag">@Bean
	public HttpClient httpClient() throws Exception {     
		
		KeyStore ks = KeyStore.getInstance(&quot;JKS&quot;);
        ks.load(keyStore.getInputStream(), keyStorePassword.toCharArray());
        try {
            keyStore.getInputStream().close();
        } catch (IOException e) {
        	e.printStackTrace();
        }
        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        keyManagerFactory.init(ks, keyStorePassword.toCharArray());

        KeyStore ts = KeyStore.getInstance(&quot;JKS&quot;);
        ts.load(trustStore.getInputStream(), trustStorePassword.toCharArray());
        try {
            trustStore.getInputStream().close();
        } catch(IOException e) {
        	e.printStackTrace();
        }
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(ts);
        
        SSLContext sslContext = SSLContexts.custom()
        		.loadKeyMaterial(ks, keyStorePassword.toCharArray())
        		.loadTrustMaterial(ts, null)
        		.build();
        SSLConnectionSocketFactory sslsf = new 
                SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
        HttpClientBuilder clientBuilder = HttpClients.custom().setSSLSocketFactory(sslsf).
        		addInterceptorFirst(new HttpComponentsMessageSender.RemoveSoapHeadersInterceptor());
       	HttpHost proxy = new HttpHost(proxyHost, proxyPort);
       	clientBuilder.setProxy(proxy);
         HttpClient httpClient = clientBuilder.build();
        
        return httpClient;

	}</pre>



<p>Definisco il contesto SSL fornendo il keystore e il truststore. Definisco il proxy fornendo host e porta e infine creo il client usando la classe HttpClientBuilder.</p>



<p>Alla prossima</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Fspring-boot-configurare-proxy-e-certificati-per-servizi-soap%2F&amp;linkname=SPRING-BOOT%20%E2%80%93%20CONFIGURARE%20PROXY%20%20e%20CERTIFICATI%20PER%20SERVIZI%20SOAP" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Fspring-boot-configurare-proxy-e-certificati-per-servizi-soap%2F&amp;linkname=SPRING-BOOT%20%E2%80%93%20CONFIGURARE%20PROXY%20%20e%20CERTIFICATI%20PER%20SERVIZI%20SOAP" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Fspring-boot-configurare-proxy-e-certificati-per-servizi-soap%2F&amp;linkname=SPRING-BOOT%20%E2%80%93%20CONFIGURARE%20PROXY%20%20e%20CERTIFICATI%20PER%20SERVIZI%20SOAP" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Fspring-boot-configurare-proxy-e-certificati-per-servizi-soap%2F&amp;linkname=SPRING-BOOT%20%E2%80%93%20CONFIGURARE%20PROXY%20%20e%20CERTIFICATI%20PER%20SERVIZI%20SOAP" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Fspring-boot-configurare-proxy-e-certificati-per-servizi-soap%2F&amp;linkname=SPRING-BOOT%20%E2%80%93%20CONFIGURARE%20PROXY%20%20e%20CERTIFICATI%20PER%20SERVIZI%20SOAP" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Fspring-boot-configurare-proxy-e-certificati-per-servizi-soap%2F&#038;title=SPRING-BOOT%20%E2%80%93%20CONFIGURARE%20PROXY%20%20e%20CERTIFICATI%20PER%20SERVIZI%20SOAP" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/09/spring-boot-configurare-proxy-e-certificati-per-servizi-soap/" data-a2a-title="SPRING-BOOT – CONFIGURARE PROXY  e CERTIFICATI PER SERVIZI SOAP"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/spring-boot-configurare-proxy-e-certificati-per-servizi-soap/">SPRING-BOOT – CONFIGURARE PROXY  e CERTIFICATI PER SERVIZI SOAP</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GO &#8211; IMPLEMENTARE DEI SERVIZI HTTP</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 13 Sep 2020 15:46:23 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[crud]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[gorilla/mux]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=633</guid>

					<description><![CDATA[<p>Nell&#8217;articolo di oggi vedremo come instanziare un server ed esporre dei servizi per lettura e scrittura di una entità. Per fare questo utilizzeremo 2 nuovi package &#8220;net/http&#8221; e &#8220;encoding/json&#8221;, il primo ci permette di instanziare il server e definire le azioni da intraprendere per dei path, il secondo ci consente agevolvemente di fare encoding e &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; IMPLEMENTARE DEI SERVIZI HTTP</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/">TUTORIAL GO – IMPLEMENTARE DEI SERVIZI HTTP</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Nell&#8217;articolo di oggi vedremo come instanziare un server ed esporre dei servizi per lettura e scrittura di una entità. Per fare questo utilizzeremo 2 nuovi package &#8220;net/http&#8221; e &#8220;encoding/json&#8221;, il primo ci permette di instanziare il server e definire le azioni da intraprendere per dei path, il secondo ci consente agevolvemente di fare encoding e decoding di oggetti json.</p>



<p>Incominciamo instanziando il server e implementando un servizio di keepalive che serve a stabilire se il server è attivo regolarmente.</p>



<pre class="crayon-plain-tag">http.HandleFunc(&quot;/isAlive&quot;, isAlive)
	log.Fatal(http.ListenAndServe(&quot;:10000&quot;, nil))</pre>



<p>La funzione HandleFunc definisce il path e il relativo handler. Per handler si intende la funzione che verrà eseguita dal server in corrispondenza della richiesta riceveuta.</p>



<pre class="crayon-plain-tag">func isAlive(response http.ResponseWriter, request *http.Request) {
	fmt.Fprintf(response, &quot;alive&quot;)
}</pre>



<p>Se abbiamo fatto tutto bene invocando il servizio http://localhost:10000/isAlive riceveremo un 200 ok con testo alive.</p>



<p>A questo punto supponiamo di voler gestire una rubrica dei contatti e pertanto definiamo prima di tutto la nostra struct Contatto</p>



<pre class="crayon-plain-tag">type contatto struct {
	Nome    string `json:&quot;Nome&quot;`
	Cognome string `json:&quot;Cognome&quot;`
}</pre>



<p>La struct presenta 2 parametri Nome e Cognome e relative regole di trascodifica in json. Definiamo l&#8217;elenco dei contatti e lo inizializziamo con dei dati di prova, simulando la presenza di un database</p>



<pre class="crayon-plain-tag">var contatti []contatto
func main() {

	contatti = []contatto{
		contatto{Nome: &quot;nome 1&quot;, Cognome: &quot;Cognome 1&quot;},
		contatto{Nome: &quot;nome 2&quot;, Cognome: &quot;Cognome 2&quot;},
	}</pre>



<p>Infine definiamo l&#8217;handler relativo</p>



<pre class="crayon-plain-tag">func elencoContatti(response http.ResponseWriter, request *http.Request) {
	json.NewEncoder(response).Encode(contatti)
}

func main() {
        http.HandleFunc(&quot;/contatti&quot;, elencoContatti)
}</pre>



<p>In tal modo invocando l&#8217;url http://localhost:10000/contatti otterremo il seguente json [{&#8220;Nome&#8221;:&#8221;nome 1&#8243;,&#8221;Cognome&#8221;:&#8221;Cognome 1&#8243;},{&#8220;Nome&#8221;:&#8221;nome 2&#8243;,&#8221;Cognome&#8221;:&#8221;Cognome 2&#8243;}]</p>



<p>Di seguito il codice completo </p>



<pre class="crayon-plain-tag">package main

import (
	&quot;encoding/json&quot;
	&quot;fmt&quot;
	&quot;log&quot;
	&quot;net/http&quot;
)

type contatto struct {
	Nome    string `json:&quot;Nome&quot;`
	Cognome string `json:&quot;Cognome&quot;`
}

func isAlive(response http.ResponseWriter, request *http.Request) {
	fmt.Fprintf(response, &quot;alive&quot;)
}

func elencoContatti(response http.ResponseWriter, request *http.Request) {
	json.NewEncoder(response).Encode(contatti)
}

var contatti []contatto

func main() {

	contatti = []contatto{
		contatto{Nome: &quot;nome 1&quot;, Cognome: &quot;Cognome 1&quot;},
		contatto{Nome: &quot;nome 2&quot;, Cognome: &quot;Cognome 2&quot;},
	}

	fmt.Println(&quot;Http server up &quot;)
	http.HandleFunc(&quot;/isAlive&quot;, isAlive)
	http.HandleFunc(&quot;/contatti&quot;, elencoContatti)

	log.Fatal(http.ListenAndServe(&quot;:10000&quot;, nil))
}</pre>



<p>Il package http ci ha consentito di tirare su il server e configurare delle risposte su dei path statici. Il package ha dei limiti, non ci permette di configurare degli endpoint variabili ed esplicitare il metodo http supportato. Per superare questo limite ci viene in soccorso un nuovo package   &#8220;github.com/gorilla/mux&#8221;. Il package va installato con il comando </p>



<pre class="crayon-plain-tag">go get -u github.com/gorilla/mux</pre>



<p>A questo per tirare su il server e configurare opportunamente gli endpoint possiamo scrivere</p>



<pre class="crayon-plain-tag">myRouter := mux.NewRouter().StrictSlash(true)
	myRouter.HandleFunc(&quot;/isAlive&quot;, isAlive).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti&quot;, elencoContatti).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti/{id}&quot;, singoloContatto).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti&quot;, creaContatto).Methods(&quot;POST&quot;)
	myRouter.HandleFunc(&quot;/contatti/{id}&quot;, eliminaContatto).Methods(&quot;DELETE&quot;)
	log.Fatal(http.ListenAndServe(&quot;:10000&quot;, myRouter))</pre>



<p>Il packge ci mette a disposizione l&#8217;oggetto router che consente per ogni  handler di definire maggiori proprietà per meglio mappare il comportamento</p>



<pre class="crayon-plain-tag">func singoloContatto(response http.ResponseWriter, request *http.Request) {
	vars := mux.Vars(request)
	key := vars[&quot;id&quot;]
	for index, contatto := range contatti {
		fmt.Println(index, &quot; &quot;, key)
		i, _ := strconv.Atoi(key)
		if index == i {
			json.NewEncoder(response).Encode(contatto)
			return
		}
	}
	response.WriteHeader(http.StatusNotFound)
}</pre>



<p>Il package ci consente agevolmente di leggere le path variable e superare i limiti del package net/http.</p>



<p>Di seguito il codice completo per l&#8217;analisi dei metodi restanti</p>



<pre class="crayon-plain-tag">package main

import (
	&quot;encoding/json&quot;
	&quot;fmt&quot;
	&quot;log&quot;
	&quot;net/http&quot;
	&quot;strconv&quot;

	&quot;github.com/gorilla/mux&quot;
)

type contatto struct {
	Nome    string `json:&quot;Nome&quot;`
	Cognome string `json:&quot;Cognome&quot;`
}

func isAlive(response http.ResponseWriter, request *http.Request) {
	fmt.Fprintf(response, &quot;alive&quot;)
}

func elencoContatti(response http.ResponseWriter, request *http.Request) {
	json.NewEncoder(response).Encode(contatti)
}

func creaContatto(response http.ResponseWriter, request *http.Request) {
	var contatto contatto
	json.NewDecoder(request.Body).Decode(&amp;amp;contatto)
	contatti = append(contatti, contatto)
	json.NewEncoder(response).Encode(contatti)
}

func singoloContatto(response http.ResponseWriter, request *http.Request) {
	vars := mux.Vars(request)
	key := vars[&quot;id&quot;]
	for index, contatto := range contatti {
		fmt.Println(index, &quot; &quot;, key)
		i, _ := strconv.Atoi(key)
		if index == i {
			json.NewEncoder(response).Encode(contatto)
			return
		}
	}
	response.WriteHeader(http.StatusNotFound)
}

func eliminaContatto(response http.ResponseWriter, request *http.Request) {
	vars := mux.Vars(request)
	key := vars[&quot;id&quot;]
	for index := range contatti {
		fmt.Println(index, &quot; &quot;, key)
		i, _ := strconv.Atoi(key)
		if index == i {
			contatti = append(contatti[:index], contatti[index+1:]...)
			response.WriteHeader(http.StatusOK)
			return
		}
	}
	response.WriteHeader(http.StatusNotFound)
}

var contatti []contatto

func main() {

	contatti = []contatto{
		contatto{Nome: &quot;nome 1&quot;, Cognome: &quot;Cognome 1&quot;},
		contatto{Nome: &quot;nome 2&quot;, Cognome: &quot;Cognome 2&quot;},
	}

	fmt.Println(&quot;Http server up &quot;)
	//http.HandleFunc(&quot;/isAlive&quot;, isAlive)
	//http.HandleFunc(&quot;/contatti&quot;, elencoContatti)

	myRouter := mux.NewRouter().StrictSlash(true)
	myRouter.HandleFunc(&quot;/isAlive&quot;, isAlive).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti&quot;, elencoContatti).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti/{id}&quot;, singoloContatto).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti&quot;, creaContatto).Methods(&quot;POST&quot;)
	myRouter.HandleFunc(&quot;/contatti/{id}&quot;, eliminaContatto).Methods(&quot;DELETE&quot;)
	log.Fatal(http.ListenAndServe(&quot;:10000&quot;, myRouter))
}</pre>



<p>Alla prossima</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/" data-a2a-title="TUTORIAL GO – IMPLEMENTARE DEI SERVIZI HTTP"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/">TUTORIAL GO – IMPLEMENTARE DEI SERVIZI HTTP</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
