﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-paulwong-随笔分类-SPRING</title><link>http://www.blogjava.net/paulwong/category/38240.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 19 Oct 2022 02:41:07 GMT</lastBuildDate><pubDate>Wed, 19 Oct 2022 02:41:07 GMT</pubDate><ttl>60</ttl><item><title>MONGODB SPRING DISTINCT</title><link>http://www.blogjava.net/paulwong/archive/2022/10/18/450835.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 18 Oct 2022 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2022/10/18/450835.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/450835.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2022/10/18/450835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/450835.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/450835.html</trackback:ping><description><![CDATA[SPRING 框架下 如果要做去重，在数据量大的时候会爆ERROR，可改用如下 写法：<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;needReorderCheck(String&nbsp;requestId)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try(MongoCursor&lt;String&gt;&nbsp;mongoCursor&nbsp;=&nbsp;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mongoTemplate.getCollection(mongoTemplate.getCollectionName(AccountNumProductLineIndex.class))<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.distinct(KEY,&nbsp;Filters.eq(REQUEST_ID,&nbsp;requestId),&nbsp;String.class)<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.iterator()<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>(MongoCursor&lt;Document&gt;&nbsp;mongoCursor&nbsp;=&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mongoTemplate.getCollection(mongoTemplate.getCollectionName(AccountNumProductLineIndex.<span style="color: #0000FF; ">class</span>))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.aggregate(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Arrays.asList(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aggregates.project(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Projections.fields(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Projections.excludeId(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Projections.include(KEY),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Projections.include(REQUEST_ID)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aggregates.match(Filters.eq(REQUEST_ID,&nbsp;requestId)),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aggregates.group("$"&nbsp;+&nbsp;KEY)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.allowDiskUse(<span style="color: #0000FF; ">true</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.iterator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;breakMe&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.info("needReorderCheck.key&nbsp;--&gt;&nbsp;start");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(mongoCursor.hasNext())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(breakMe)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mongoCursor.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;keyDocument&nbsp;=&nbsp;mongoCursor.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;keyDocument.getString("_id");<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;mongoCursor.next().getString(KEY);<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.info("needReorderCheck.keyDocument&nbsp;--&gt;&nbsp;{},&nbsp;key&nbsp;--&gt;&nbsp;{}",&nbsp;keyDocument,&nbsp;key);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>(MongoCursor&lt;Document&gt;&nbsp;indexMongoCursor&nbsp;=&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mongoTemplate.getCollection(AccountNumProductLineIndex.COLLECTION_NAME)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.find(Filters.and(Filters.eq(REQUEST_ID,&nbsp;requestId),&nbsp;Filters.eq(KEY,&nbsp;key)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.iterator()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;preIndex&nbsp;=&nbsp;-1,&nbsp;currentIndex&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;preIndexDocument&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>,&nbsp;currentIndexDocument;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(indexMongoCursor.hasNext())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentIndexDocument&nbsp;=&nbsp;indexMongoCursor.next();<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(currentIndexDocument.toJson());</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(preIndexDocument&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentIndex&nbsp;=&nbsp;currentIndexDocument.getInteger(INDEX);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preIndex&nbsp;=&nbsp;preIndexDocument.getInteger(INDEX);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(currentIndex&nbsp;-&nbsp;preIndex&nbsp;&gt;&nbsp;1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexMongoCursor.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;breakMe&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preIndexDocument&nbsp;=&nbsp;currentIndexDocument;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br /><img src ="http://www.blogjava.net/paulwong/aggbug/450835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2022-10-18 10:22 <a href="http://www.blogjava.net/paulwong/archive/2022/10/18/450835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Downloading Large Files using Spring WebClient</title><link>http://www.blogjava.net/paulwong/archive/2022/09/22/450822.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 22 Sep 2022 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2022/09/22/450822.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/450822.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2022/09/22/450822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/450822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/450822.html</trackback:ping><description><![CDATA[<a href="https://www.amitph.com/spring-webclient-large-file-download/" target="_blank">https://www.amitph.com/spring-webclient-large-file-download/</a><br /><br /><a href="https://github.com/amitrp/spring-examples/blob/main/spring-webflux-webclient/src/main/java/com/amitph/spring/webclients/service/FileDownloaderWebClientService.java" target="_blank">https://github.com/amitrp/spring-examples/blob/main/spring-webflux-webclient/src/main/java/com/amitph/spring/webclients/service/FileDownloaderWebClientService.java</a><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;lombok.RequiredArgsConstructor;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.core.io.buffer.DataBuffer;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.core.io.buffer.DataBufferUtils;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Service;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.reactive.function.client.WebClient;<br /><span style="color: #0000FF; ">import</span>&nbsp;reactor.core.publisher.Flux;<br /><span style="color: #0000FF; ">import</span>&nbsp;reactor.core.publisher.Mono;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.nio.file.Files;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.nio.file.Path;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.nio.file.StandardOpenOption;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Objects;<br /><br />@Service<br />@RequiredArgsConstructor<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;FileDownloaderWebClientService&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;WebClient&nbsp;webClient;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Reads&nbsp;the&nbsp;complete&nbsp;file&nbsp;in-memory.&nbsp;Thus,&nbsp;only&nbsp;useful&nbsp;for&nbsp;very&nbsp;large&nbsp;file<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;downloadUsingByteArray(Path&nbsp;destination)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mono&lt;<span style="color: #0000FF; ">byte</span>[]&gt;&nbsp;monoContents&nbsp;=&nbsp;webClient<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.uri("/largefiles/1")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.retrieve()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.bodyToMono(<span style="color: #0000FF; ">byte</span>[].<span style="color: #0000FF; ">class</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Files.write(destination,&nbsp;Objects.requireNonNull(monoContents.share().block()),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StandardOpenOption.CREATE);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Reading&nbsp;file&nbsp;using&nbsp;Mono&nbsp;will&nbsp;try&nbsp;to&nbsp;fit&nbsp;the&nbsp;entire&nbsp;file&nbsp;into&nbsp;the&nbsp;DataBuffer.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Results&nbsp;in&nbsp;exception&nbsp;when&nbsp;the&nbsp;file&nbsp;is&nbsp;larger&nbsp;than&nbsp;the&nbsp;DataBuffer&nbsp;capacity.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;downloadUsingMono(Path&nbsp;destination)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mono&lt;DataBuffer&gt;&nbsp;dataBuffer&nbsp;=&nbsp;webClient<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.uri("/largefiles/1")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.retrieve()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.bodyToMono(DataBuffer.<span style="color: #0000FF; ">class</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataBufferUtils.write(dataBuffer,&nbsp;destination,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StandardOpenOption.CREATE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.share().block();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Having&nbsp;using&nbsp;Flux&nbsp;we&nbsp;can&nbsp;download&nbsp;files&nbsp;of&nbsp;any&nbsp;size&nbsp;safely.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Optionally,&nbsp;we&nbsp;can&nbsp;configure&nbsp;DataBuffer&nbsp;capacity&nbsp;for&nbsp;better&nbsp;memory&nbsp;utilization.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;downloadUsingFlux(Path&nbsp;destination)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flux&lt;DataBuffer&gt;&nbsp;dataBuffer&nbsp;=&nbsp;webClient<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.uri("/largefiles/1")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.retrieve()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.bodyToFlux(DataBuffer.<span style="color: #0000FF; ">class</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataBufferUtils.write(dataBuffer,&nbsp;destination,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StandardOpenOption.CREATE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.share().block();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><img src ="http://www.blogjava.net/paulwong/aggbug/450822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2022-09-22 13:14 <a href="http://www.blogjava.net/paulwong/archive/2022/09/22/450822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTEGRATION - ENRICH</title><link>http://www.blogjava.net/paulwong/archive/2021/09/21/435976.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 21 Sep 2021 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/09/21/435976.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435976.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/09/21/435976.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435976.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435976.html</trackback:ping><description><![CDATA[enrich时可以发起一个子流程，取得结果后再设置回当前的对象中。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;org.springframework.integration.stackoverflow.enricher;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Map;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.function.Function;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.stream.Collectors;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.SpringApplication;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.autoconfigure.SpringBootApplication;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Bean;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.http.HttpMethod;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.IntegrationFlow;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.IntegrationFlows;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.Transformers;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.http.dsl.Http;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.client.RestTemplate;<br /><br />@SpringBootApplication<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;SpringIntegrationEnricherApplication&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SpringApplication.run(SpringIntegrationEnricherApplication.<span style="color: #0000FF; ">class</span>,&nbsp;args);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;jsonEnricherFlow(RestTemplate&nbsp;restTemplate)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows.from(Function.<span style="color: #0000FF; ">class</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.transform(Transformers.fromJson(Map.<span style="color: #0000FF; ">class</span>))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.enrich((enricher)&nbsp;-&gt;&nbsp;enricher<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&lt;Map&lt;String,&nbsp;?&gt;&gt;requestPayload((message)&nbsp;-&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((List&lt;?&gt;)&nbsp;message.getPayload().get("attributeIds"))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.stream()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(Object::toString)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.joining(",")))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.requestSubFlow((subFlow)&nbsp;-&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subFlow.handle(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Http.outboundGateway("/attributes?id={ids}",&nbsp;restTemplate)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.httpMethod(HttpMethod.GET)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.expectedResponseType(Map.<span style="color: #0000FF; ">class</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.uriVariable("ids",&nbsp;"payload")))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.propertyExpression("attributes",&nbsp;"payload.attributes"))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&lt;Map&lt;String,&nbsp;?&gt;,&nbsp;Map&lt;String,&nbsp;?&gt;&gt;transform(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(payload)&nbsp;-&gt;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;payload.remove("attributeIds");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;payload;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.transform(Transformers.toJson())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br /><a href="https://stackoverflow.com/questions/58205432/spring-integration-enrich-transform-message-using-rest-call" target="_blank">https://stackoverflow.com/questions/58205432/spring-integration-enrich-transform-message-using-rest-call</a><br /><br /><a href="https://www.tabnine.com/web/assistant/code/rs/5c781b6ae70f87000197ab9f#L312" target="_blank">https://www.tabnine.com/web/assistant/code/rs/5c781b6ae70f87000197ab9f#L312</a><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-09-21 13:40 <a href="http://www.blogjava.net/paulwong/archive/2021/09/21/435976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SRPING自带的事件监听机制</title><link>http://www.blogjava.net/paulwong/archive/2021/04/09/435851.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 09 Apr 2021 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/04/09/435851.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435851.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/04/09/435851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435851.html</trackback:ping><description><![CDATA[定义一个事件，因SPRING中可以有不同的事件，需要定义一个类以作区分：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;lombok.Getter;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.ApplicationEvent;<br /><br /><br />@Getter<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;JavaStackEvent&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;ApplicationEvent&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Create&nbsp;a&nbsp;new&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;ApplicationEvent}.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;source&nbsp;the&nbsp;object&nbsp;on&nbsp;which&nbsp;the&nbsp;event&nbsp;initially&nbsp;occurred&nbsp;or&nbsp;with<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;which&nbsp;the&nbsp;event&nbsp;is&nbsp;associated&nbsp;(never&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;null})<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;JavaStackEvent(Object&nbsp;source)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>(source);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />}</div><br />定义一个此事件观察者，即感兴趣者：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;lombok.NonNull;<br /><span style="color: #0000FF; ">import</span>&nbsp;lombok.RequiredArgsConstructor;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.ApplicationListener;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.scheduling.annotation.Async;<br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;观察者：读者粉丝<br />&nbsp;</span><span style="color: #008000; ">*/</span><br />@RequiredArgsConstructor<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ReaderListener&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;ApplicationListener&lt;JavaStackEvent&gt;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@NonNull<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;name;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;article;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Async<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;onApplicationEvent(JavaStackEvent&nbsp;event)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;更新文章</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateArticle(event);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;updateArticle(JavaStackEvent&nbsp;event)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.article&nbsp;=&nbsp;(String)&nbsp;event.getSource();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.printf("我是读者：%s，文章已更新为：%s\n",&nbsp;<span style="color: #0000FF; ">this</span>.name,&nbsp;<span style="color: #0000FF; ">this</span>.article);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br />注册感兴趣者（将自身注入SPRING容器则完成注册），并制定发布机制（通过CONTEXT发布事件）：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;lombok.extern.slf4j.Slf4j;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.CommandLineRunner;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.ApplicationContext;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Bean;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Configuration;<br /><br />@Slf4j<br />@Configuration<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ObserverConfiguration&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;CommandLineRunner&nbsp;commandLineRunner(ApplicationContext&nbsp;context)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(args)&nbsp;-&gt;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("发布事件：什么是观察者模式？");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.publishEvent(<span style="color: #0000FF; ">new</span>&nbsp;JavaStackEvent("什么是观察者模式？"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ReaderListener&nbsp;readerListener1(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ReaderListener("小明");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ReaderListener&nbsp;readerListener2(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ReaderListener("小张");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ReaderListener&nbsp;readerListener3(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ReaderListener("小爱");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><img src ="http://www.blogjava.net/paulwong/aggbug/435851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-04-09 14:55 <a href="http://www.blogjava.net/paulwong/archive/2021/04/09/435851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>csv 文件打开乱码，有哪些方法可以解决？</title><link>http://www.blogjava.net/paulwong/archive/2021/03/23/435832.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 23 Mar 2021 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/03/23/435832.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435832.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/03/23/435832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435832.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435832.html</trackback:ping><description><![CDATA[Excel 在读取 csv 的时候是通过读取文件头上的 bom 来识别编码的，这导致如果我们生成 csv 文件的平台输出无 bom 头编码的 csv 文件（例如 utf-8 ，在标准中默认是可以没有 bom 头的），Excel 只能自动按照默认编码读取，不一致就会出现乱码问题了。<br /><br />掌握了这点相信乱码已经无法阻挡我们前进的步伐了：只需将不带 bom 头编码的 csv 文件，用文本编辑器（工具随意，推荐 notepad++ ）打开并转换为带 bom 的编码形式（具体编码方式随意），问题解决。<br /><br />当然，如果你是像我一样的码农哥哥，在生成 csv 文件的时候写入 bom 头更直接点，用户会感谢你的。<br /><br />附录：对于 utf-8 编码，unicode 标准中是没有 bom 定义的，微软在自己的 utf-8 格式的文本文件之前加上了EF BB BF三个字节作为识别此编码的 bom 头，这也解释了为啥大部分乱码都是 utf-8 编码导致的原因<br /><br />SPRING BATCH中生成CSV文件时的解决方案：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">new</span>&nbsp;FlatFileItemWriterBuilder&lt;T&gt;()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.name(itemWriterName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.resource(outputResource)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.lineAggregator(lineAggregator)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.headerCallback(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;-&gt;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(header);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h.write('\uFEFF');<span style="color: #008000; ">//</span><span style="color: #008000; ">只需加这一行</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h.write(header);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.build();</div><br /><a href="https://stackoverflow.com/questions/48952319/send-csv-file-encoded-in-utf-8-with-bom-in-java" target="_blank">https://stackoverflow.com/questions/48952319/send-csv-file-encoded-in-utf-8-with-bom-in-java</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-03-23 10:30 <a href="http://www.blogjava.net/paulwong/archive/2021/03/23/435832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSR-303 Bean Validation - Date String Validation </title><link>http://www.blogjava.net/paulwong/archive/2021/02/25/435810.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 25 Feb 2021 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/02/25/435810.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435810.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/02/25/435810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435810.html</trackback:ping><description><![CDATA[@Past @Future只针对Date类型的验证，如果是String类型的验证，则不适用。<br />其实可以新加一个方法返回Date类型，再配合@Future@Past&nbsp;进行验证。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Future(message&nbsp;=&nbsp;"Invalid&nbsp;CN_ID_INFO.EXPIRE_DATE.")<br /><span style="color: #0000FF; ">private</span>&nbsp;LocalDate&nbsp;getValidExpireDate()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;LocalDate.parse(this.dateString,&nbsp;DateTimeFormatter.ofPattern("yyyy-MM-dd"));<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br />此方法对dateString进行解释，返回LocalDate，如果dateString为空或格式错误，则返回空，再配合@Future&nbsp;进行是否未来日期的验证。<br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-02-25 09:44 <a href="http://www.blogjava.net/paulwong/archive/2021/02/25/435810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSR-303 Bean Validation - Conditional Validation</title><link>http://www.blogjava.net/paulwong/archive/2021/02/25/435809.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 25 Feb 2021 01:24:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/02/25/435809.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435809.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/02/25/435809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435809.html</trackback:ping><description><![CDATA[bean validation的注释是针对单个变量的，如果要针对多个变量的联动，则不行，需要用到这个注释。<br />这种方法避免了自定义校验器而增加类。<br /><a href="https://www.chkui.com/article/java/java_bean_validation" target="_blank">https://www.chkui.com/article/java/java_bean_validation</a><br /><br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->@AssertTrue(message&nbsp;=&nbsp;"Missing&nbsp;BANK_CARD_IMG_INFO.IMG")<br />
<span style="color: #0000FF; ">private</span>&nbsp;Boolean&nbsp;getValidImg()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(YNEnum.Y.code.equals(<span style="color: #0000FF; ">super</span>.getNeedChecked()))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;StringUtils.hasText(<span style="color: #0000FF; ">this</span>.img);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<span style="color: #008000; ">//</span><span style="color: #008000; ">igore&nbsp;checking.</span><span style="color: #008000; "><br />
</span>}</div><br />这个是当needChecked为Y的时候才执行检查img变量是否为空。<br />有几点注意：<br /><ol><li>方法名称要以get开头<br /></li><li>返回类型用Boolean，而不用boolean<br /></li><li>返回值有三种：true,false,null如果是null则当成通过，与true的结果一样</li></ol><img src ="http://www.blogjava.net/paulwong/aggbug/435809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-02-25 09:24 <a href="http://www.blogjava.net/paulwong/archive/2021/02/25/435809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSR-303 Bean Validation</title><link>http://www.blogjava.net/paulwong/archive/2021/01/28/435786.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 28 Jan 2021 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/01/28/435786.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435786.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/01/28/435786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435786.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435786.html</trackback:ping><description><![CDATA[接收数据的JAVA BEAN通常需要验证其中字段的正确性，如不准为空，符合EMAIL格式等。<br /><div>JSR-303 Bean Validation则提供了这样的便捷。<br /><br />只要在JAVA BEAN中需要验证的字段加@NotNull这种标签，然后在SERVISE中的输入参数中加@Valid标签，则就激活验证流程。<br />也可以编程的方式自己验证：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@MessageEndpoint<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">@Validated</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MqMessageCcdValidator&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Logger&nbsp;LOGGER&nbsp;=&nbsp;LoggerFactory.getLogger(MqMessageCcdValidator.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Validator&nbsp;validator;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@ServiceActivator<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;MqMessage&lt;CcdRequest&gt;&nbsp;validate(<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;@Valid&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;Message&lt;MqMessage&lt;CcdRequest&gt;&gt;&nbsp;requestMessage)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&lt;ConstraintViolation&lt;MqMessage&lt;CcdRequest&gt;&gt;&gt;&nbsp;set&nbsp;=&nbsp;validator.validate(requestMessage.getPayload());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(CollectionUtils.isNotEmpty(set))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompositeException&nbsp;compositeException&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CompositeException();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set.forEach(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constraintViolation&nbsp;-&gt;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.info("{}",&nbsp;constraintViolation);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReqInfoValidationException&nbsp;exception&nbsp;=<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ReqInfoValidationException(constraintViolation.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compositeException.addException(exception);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;MessageHandlingException(requestMessage,&nbsp;compositeException);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;requestMessage.getPayload();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br />自定义验证规则<br />可用标签来做，以下为验证手机号的规则：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;java.lang.annotation.RetentionPolicy.RUNTIME;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.lang.annotation.ElementType;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.lang.annotation.Retention;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.lang.annotation.Target;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;javax.validation.Constraint;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.validation.Payload;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.validation.ReportAsSingleViolation;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.validation.constraints.Pattern;<br /><br />@Retention(RUNTIME)<br />@Target(value&nbsp;=&nbsp;{&nbsp;ElementType.FIELD,&nbsp;ElementType.PARAMETER,&nbsp;ElementType.ANNOTATION_TYPE&nbsp;})<br />@Constraint(validatedBy&nbsp;=&nbsp;{})<br />@ReportAsSingleViolation<br />@Pattern(regexp&nbsp;=&nbsp;"^1[3-9]\\d{9}$")<br /><span style="color: #0000FF; ">public</span>&nbsp;@<span style="color: #0000FF; ">interface</span>&nbsp;ChinaPhone&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;message()&nbsp;<span style="color: #0000FF; ">default</span>&nbsp;"Invalid&nbsp;Chinese&nbsp;mobile&nbsp;No.";<br />&nbsp;&nbsp;&nbsp;&nbsp;Class&lt;?&gt;[]&nbsp;groups()&nbsp;<span style="color: #0000FF; ">default</span>&nbsp;{};<br />&nbsp;&nbsp;&nbsp;&nbsp;Class&lt;?&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Payload&gt;[]&nbsp;payload()&nbsp;<span style="color: #0000FF; ">default</span>&nbsp;{};<br />}</div><br />如果比较复杂的验证规则，则参见：<br /><a href="https://reflectoring.io/bean-validation-with-spring-boot/#implementing-a-custom-validator" target="_blank">https://reflectoring.io/bean-validation-with-spring-boot/#implementing-a-custom-validator</a><br /><br />How to use Java Bean Validation in Spring Boot<br /><a href="https://nullbeans.com/how-to-use-java-bean-validation-in-spring-boot/" target="_blank">https://nullbeans.com/how-to-use-java-bean-validation-in-spring-boot/</a><br /><br />Complete Guide to Validation With Spring Boot<br /><a href="https://reflectoring.io/bean-validation-with-spring-boot/" target="_blank">https://reflectoring.io/bean-validation-with-spring-boot/</a><br /><br />Spring JMS Validate Messages using JSR-303 Bean Validation<br /><a href="https://memorynotfound.com/spring-jms-validate-messages-jsr-303-bean-validation/" target="_blank">https://memorynotfound.com/spring-jms-validate-messages-jsr-303-bean-validation/</a><br /><br />Spring REST Validation Example<br /><a href="https://mkyong.com/spring-boot/spring-rest-validation-example/" target="_blank">https://mkyong.com/spring-boot/spring-rest-validation-example/<br /><br /></a>Spring Boot 整合 Bean Validation 校验数据<br /><br /><a href="https://blog.csdn.net/wangzhihao1994/article/details/108403732" target="_blank">https://blog.csdn.net/wangzhihao1994/article/details/108403732</a></div><img src ="http://www.blogjava.net/paulwong/aggbug/435786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-01-28 10:35 <a href="http://www.blogjava.net/paulwong/archive/2021/01/28/435786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTEGRATION HEADER问题</title><link>http://www.blogjava.net/paulwong/archive/2020/10/20/435696.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 20 Oct 2020 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/10/20/435696.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435696.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/10/20/435696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435696.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435696.html</trackback:ping><description><![CDATA[当SPRING INTEGRATION的流程中从HTTP outboundGateway转成JmsGateway时，会报header的错误，这时就要把相关多余的header移除。<br />
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->.headerFilter("Api-Key",&nbsp;"Content-Type",&nbsp;"X-Powered-By",&nbsp;"Content-Language",&nbsp;"Transfer-Encoding",&nbsp;"Cache-Control",&nbsp;"Keep-Alive",&nbsp;"Set-Cookie")</div>
<br /><a href="https://stackoverflow.com/questions/50608415/cwsia0112e-the-property-name-keep-alive-is-not-a-valid-java-identifier" target="_blank">https://stackoverflow.com/questions/50608415/cwsia0112e-the-property-name-keep-alive-is-not-a-valid-java-identifier</a><img src ="http://www.blogjava.net/paulwong/aggbug/435696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-10-20 14:56 <a href="http://www.blogjava.net/paulwong/archive/2020/10/20/435696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RestTemplate处理请求状态码为非200的返回数据</title><link>http://www.blogjava.net/paulwong/archive/2020/10/16/435694.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 16 Oct 2020 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/10/16/435694.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435694.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/10/16/435694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435694.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435694.html</trackback:ping><description><![CDATA[RestTemplate是Spring提供的用于访问Rest服务的客户端，<br /><br />RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。<br /><br />调用RestTemplate的默认构造函数，RestTemplate对象在底层通过使用java.net包下的实现创建HTTP 请求，<br /><br />可以通过使用ClientHttpRequestFactory指定不同的HTTP请求方式。<br /><br />ClientHttpRequestFactory接口主要提供了两种实现方式<br /><br />1、一种是SimpleClientHttpRequestFactory，使用J2SE提供的方式（既java.net包提供的方式）创建底层的Http请求连接。<br /><br />2、一种方式是使用HttpComponentsClientHttpRequestFactory方式，底层使用HttpClient访问远程的Http服务，使用HttpClient可以配置连接池和证书等信息。<br /><br />默认的 RestTemplate 有个机制是请求状态码非200 就抛出异常，会中断接下来的操作。如果不想中断对结果数据得解析，可以通过覆盖默认的 ResponseErrorHandler ，见下面的示例，示例中的方法中基本都是空方法，只要对hasError修改下，让他一直返回true，即是不检查状态码及抛异常了。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;com.example.demo.web.config;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Bean;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Configuration;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.http.client.ClientHttpRequestFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.http.client.ClientHttpResponse;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.http.client.SimpleClientHttpRequestFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.client.ResponseErrorHandler;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.client.RestTemplate;<br /><br />@Configuration<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;RestTemplateConfig&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;RestTemplate&nbsp;restTemplate(ClientHttpRequestFactory&nbsp;factory)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RestTemplate&nbsp;restTemplate&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;RestTemplate(factory);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResponseErrorHandler&nbsp;responseErrorHandler&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ResponseErrorHandler()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;hasError(ClientHttpResponse&nbsp;clientHttpResponse)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;handleError(ClientHttpResponse&nbsp;clientHttpResponse)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;restTemplate.setErrorHandler(responseErrorHandler);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;restTemplate;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ClientHttpRequestFactory&nbsp;simpleClientHttpRequestFactory(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleClientHttpRequestFactory&nbsp;factory&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SimpleClientHttpRequestFactory();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">读取超时5秒</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory.setReadTimeout(5000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">连接超时15秒</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory.setConnectTimeout(15000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;factory;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br />RestTemppate运用实例<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;com.example.demo.web.controller;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.Logger;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.LoggerFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.http.ResponseEntity;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.bind.annotation.GetMapping;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.bind.annotation.RestController;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.client.RestTemplate;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.example.demo.domain.Book;<br /><br />@RestController<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;TestBookController&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Logger&nbsp;logger&nbsp;=&nbsp;LoggerFactory.getLogger(getClass());<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;RestTemplate&nbsp;restTemplate;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@GetMapping("/testaddbook")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Book&nbsp;testAddBook()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Book&nbsp;book&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Book();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResponseEntity&lt;Book&gt;&nbsp;responseEntity&nbsp;=&nbsp;restTemplate.postForEntity(&nbsp;"http://localhost:8061/book",&nbsp;book&nbsp;,&nbsp;Book.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;responseEntity.getBody();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br />其他方法，catch&nbsp;<span style="font-size: 13px; background-color: #eeeeee;">HttpStatusCodeException&nbsp;</span>,&nbsp;<span style="color: #008000; font-size: 13px; background-color: #eeeeee;">e.getResponseBodyAsString()</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;ResponseEntity&lt;Component&gt;&nbsp;response&nbsp;=&nbsp;restTemplate.exchange(webSvcURL,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpMethod.POST,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;requestEntity,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Component.<span style="color: #0000FF; ">class</span>);<br />}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(HttpStatusCodeException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;List&lt;String&gt;&nbsp;customHeader&nbsp;=&nbsp;e.getResponseHeaders().get("x-app-err-id");<br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;svcErrorMessageID&nbsp;=&nbsp;"";<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(customHeader&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;svcErrorMessageID&nbsp;=&nbsp;customHeader.get(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CustomException(e.getMessage(),&nbsp;e,&nbsp;svcErrorMessageID);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;You&nbsp;can&nbsp;get&nbsp;the&nbsp;body&nbsp;too&nbsp;but&nbsp;you&nbsp;will&nbsp;have&nbsp;to&nbsp;deserialize&nbsp;it&nbsp;yourself<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;e.getResponseBodyAsByteArray()<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;e.getResponseBodyAsString()</span><span style="color: #008000; "><br /></span>}</div><br /><a href="https://stackoverflow.com/questions/7878002/resttemplate-handling-response-headers-body-in-exceptions-restclientexception" target="_blank">https://stackoverflow.com/questions/7878002/resttemplate-handling-response-headers-body-in-exceptions-restclientexception</a><br /><br /><a href="https://stackoverflow.com/questions/38093388/spring-resttemplate-exception-handling/51805956#51805956" target="_blank">https://stackoverflow.com/questions/38093388/spring-resttemplate-exception-handling/51805956#51805956</a><img src ="http://www.blogjava.net/paulwong/aggbug/435694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-10-16 16:54 <a href="http://www.blogjava.net/paulwong/archive/2020/10/16/435694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Error handling in spring integration - How to get all the errors thrown in multiple threads and send them to the error-channel</title><link>http://www.blogjava.net/paulwong/archive/2020/10/15/435693.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 15 Oct 2020 11:21:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/10/15/435693.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435693.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/10/15/435693.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435693.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435693.html</trackback:ping><description><![CDATA[在SPRING INTEGRATION中，如果exception发生在各种thread里时，如何将exception返回到指定的channel，之后再绕回到aggrator-channel中。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Bean<br /><span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;provisionUserFlow()&nbsp;{<br /><span style="color: #0000FF; ">return</span><br />&nbsp;&nbsp;&nbsp;&nbsp;IntegrationFlows.from("input.channel")<br />&nbsp;&nbsp;&nbsp;&nbsp;.publishSubscribeChannel(Executors.newCachedThreadPool(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;-&gt;&nbsp;s.applySequence(<span style="color: #0000FF; ">true</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(f&nbsp;-&gt;&nbsp;f.enrichHeaders(e&nbsp;-&gt;&nbsp;e.header(MessageHeaders.ERROR_CHANNEL,&nbsp;"errorChannel",&nbsp;<span style="color: #0000FF; ">true</span>))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.handle(provisionerA,&nbsp;"provision")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.channel("aggregatorChannel")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(f&nbsp;-&gt;&nbsp;f.enrichHeaders(e&nbsp;-&gt;&nbsp;e.header(MessageHeaders.ERROR_CHANNEL,&nbsp;"errorChannel",&nbsp;<span style="color: #0000FF; ">true</span>))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.handle(provisionerB,&nbsp;"provision")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.channel("aggregatorChannel"))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />}<br /><br />@Bean<br /><span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;aggregateFlow()&nbsp;{<br />&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows.from("aggregatorChannel")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.channel(&nbsp;aggregatorChannel)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.aggregate(&nbsp;a&nbsp;-&gt;&nbsp;a.processor(&nbsp;collect,&nbsp;"aggregatingMethod"))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />}<br /><br />@Transformer(&nbsp;inputChannel&nbsp;=&nbsp;"errorChannel",&nbsp;outputChannel&nbsp;=&nbsp;"aggregatorChannel")<br /><span style="color: #0000FF; ">public</span>&nbsp;Message&lt;?&gt;&nbsp;errorChannelHandler(ErrorMessage&nbsp;errorMessage)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;RuntimeException&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Message&lt;?&gt;&nbsp;failedMessage&nbsp;=&nbsp;&nbsp;((MessagingException)&nbsp;errorMessage.getPayload()).getFailedMessage();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Exception&nbsp;exception&nbsp;=&nbsp;(Exception)&nbsp;errorMessage.getPayload();<br /><br />&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&nbsp;MessageBuilder.withPayload(&nbsp;exception.getMessage())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.copyHeadersIfAbsent(&nbsp;failedMessage.getHeaders()&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.build();<br />}</div><br /><br /><a href="https://stackoverflow.com/q/46495127/11790720" target="_blank">https://stackoverflow.com/q/46495127/11790720</a><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-10-15 19:21 <a href="http://www.blogjava.net/paulwong/archive/2020/10/15/435693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTEGRATION子FLOW</title><link>http://www.blogjava.net/paulwong/archive/2020/10/15/435692.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 15 Oct 2020 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/10/15/435692.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435692.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/10/15/435692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435692.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435692.html</trackback:ping><description><![CDATA[split-route-aggregate flow&nbsp;<br />
split之后，可以将message分给不同的子flow处理，配置如下：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->@Bean<br />
<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;parallelSplitRouteAggregateFlow()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.from(Http.inboundGateway("/trigger"))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.handle((p,&nbsp;h)&nbsp;-&gt;&nbsp;Arrays.asList(1,&nbsp;2,&nbsp;3))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.split()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.channel(MessageChannels.executor(Executors.newCachedThreadPool()))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&lt;Integer,&nbsp;Boolean&gt;route(o&nbsp;-&gt;&nbsp;o&nbsp;%&nbsp;2&nbsp;==&nbsp;0,&nbsp;m&nbsp;-&gt;&nbsp;m<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subFlowMapping(<span style="color: #0000FF; ">true</span>,&nbsp;sf&nbsp;-&gt;&nbsp;sf.<span style="background-color: yellow;">gateway</span>(oddFlow()))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subFlowMapping(<span style="color: #0000FF; ">false</span>,&nbsp;sf&nbsp;-&gt;&nbsp;sf.<span style="background-color: yellow;">gateway</span>(evenFlow())))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.aggregate()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />
}<br />
<br />
@Bean<br />
<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;oddFlow()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;flow&nbsp;-&gt;&nbsp;flow.&lt;Integer&gt;handle((payload,&nbsp;headers)&nbsp;-&gt;&nbsp;"odd");<br />
}<br />
<br />
@Bean<br />
<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;evenFlow()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;flow&nbsp;-&gt;&nbsp;flow.&lt;Integer&gt;handle((payload,&nbsp;headers)&nbsp;-&gt;&nbsp;"even");<br />
}</div><br /><br /><a href="https://stackoverflow.com/questions/50121384/spring-integration-parallel-split-route-aggregate-flow-fails-due-to-one-way-mess" target="_blank">https://stackoverflow.com/questions/50121384/spring-integration-parallel-split-route-aggregate-flow-fails-due-to-one-way-mess</a><img src ="http://www.blogjava.net/paulwong/aggbug/435692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-10-15 11:29 <a href="http://www.blogjava.net/paulwong/archive/2020/10/15/435692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怀旧框架集合</title><link>http://www.blogjava.net/paulwong/archive/2020/10/09/435687.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 09 Oct 2020 11:14:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/10/09/435687.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435687.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/10/09/435687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435687.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近在公司用JUP框架做项目,发现这个框架是别人基于SpringSide封装的,所以打算学习下,SpringSide,其中遇到了很多坑,做个记录,网上关于这方面的资料都有些老了,而且SpringSide最新的版本是SpringSide-Utils,老一点的版本为v4.2.2.GA,以下分别对这两个版本分别介绍下,主要内容来自于网上。一些资料:Github源码地址: &nbsp;https://gi...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2020/10/09/435687.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/435687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-10-09 19:14 <a href="http://www.blogjava.net/paulwong/archive/2020/10/09/435687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Retry框架——看这篇就够了</title><link>http://www.blogjava.net/paulwong/archive/2020/09/15/435662.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 15 Sep 2020 05:39:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/09/15/435662.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435662.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/09/15/435662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435662.html</trackback:ping><description><![CDATA[<a href="https://my.oschina.net/marvelcode/blog/4563352" target="_blank">https://my.oschina.net/marvelcode/blog/4563352</a><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-09-15 13:39 <a href="http://www.blogjava.net/paulwong/archive/2020/09/15/435662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LOGBACK FOR SPRING</title><link>http://www.blogjava.net/paulwong/archive/2019/11/19/434914.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 19 Nov 2019 07:14:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/11/19/434914.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434914.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/11/19/434914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434914.html</trackback:ping><description><![CDATA[当程序中使用LOGGER.INFO("MESSAGE");要求打印日志时，LOGBACK会获取该行代码所在类的全名，和打印等级(INFO/DEBUG等)，再在配置文件的&lt;logger&gt;中查找对应logger，使用其配置的appender组件打印日志，如无法找到对应的logger，则使用&lt;root&gt;对应的appender打印日志。<br /><br />其中appender是用来输出日志，有file和console两个实现，console则是向控制台输出日志，而file则是向文件输出日志。<br />rolling file appender中，有rollingPolicy和triggerPolicy两个主要属性，rollingPolicy是确定如何处理日志文件，而triggerPolicy则是确定何时处理日志文件。<br /><br />如果要使用SPRING针对LOGBACK的一些功能，如profile等，则要将logback.xml的配置文件命名为logback-spring.xml，并在SPRING中配置，logging.config= logback-spring.xml。<br /><br />SPRING会将logging.file、logging.path这些配置转成系统变量LOG_FILE、LOG_PATH，可在配置文件中直接引用，如${LOG_FILE}。<br /><br />如果logback配置文件要SPRING的其他属性，则要使用如下标签：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">springProperty&nbsp;</span><span style="color: #FF0000; ">scope</span><span style="color: #0000FF; ">="context"</span><span style="color: #FF0000; ">&nbsp;name</span><span style="color: #0000FF; ">="logLevel"</span><span style="color: #FF0000; ">&nbsp;source</span><span style="color: #0000FF; ">="log.level"</span><span style="color: #0000ff;">/&gt;</span></div><br />如果要使用LOGBACK的一些常用属性，可引入：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">include&nbsp;</span><span style="color: #FF0000; ">resource</span><span style="color: #0000FF; ">="org/springframework/boot/logging/logback/defaults.xml"</span><span style="color: #0000FF; ">/&gt;<br /></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">include&nbsp;</span><span style="color: #ff0000;">resource</span><span style="color: #0000ff;">="org/springframework/boot/logging/logback/console-appender.xml"</span><span style="color: #0000ff;">/&gt;</span></div>如CONSOLE APPENDER，此resource在spring-boot-version.jar中。<br /><br /><br />=========================================<br />看完这个不会配置 logback ，请你吃瓜！<br /><a href="https://juejin.im/post/5b51f85c5188251af91a7525" target="_blank">https://juejin.im/post/5b51f85c5188251af91a7525</a><br /><br />logback解析&#8212;&#8212;Appender<br /><a href="https://juejin.im/post/5a39c91cf265da4327185d10" target="_blank">https://juejin.im/post/5a39c91cf265da4327185d10</a><br /><br />SpringBoot中logback.xml使用application.yml中属性<br /><a href="https://www.cnblogs.com/jianliang-Wu/p/8945343.html" target="_blank">https://www.cnblogs.com/jianliang-Wu/p/8945343.html</a><br /><br />springboot使用logback-spring.xml配置讲解<br /><a href="https://blog.csdn.net/heguiliang_123/article/details/80296745" target="_blank">https://blog.csdn.net/heguiliang_123/article/details/80296745</a><br /><br />Logback配置<br /><a href="https://www.cnblogs.com/cjsblog/p/9113131.html" target="_blank">https://www.cnblogs.com/cjsblog/p/9113131.html</a><br /><br />Logback中如何自定义灵活的日志过滤规则<br /><a href="https://www.jianshu.com/p/d6360c517264" target="_blank">https://www.jianshu.com/p/d6360c517264</a><br /><br />Spring Boot中的日志<br /><a href="http://loveshisong.cn/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2016-11-03-Spring-Boot%E4%B8%AD%E7%9A%84%E6%97%A5%E5%BF%97.html" target="_blank">http://loveshisong.cn/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2016-11-03-Spring-Boot%E4%B8%AD%E7%9A%84%E6%97%A5%E5%BF%97.html</a><br /><br />Spring Boot与logback总结<br /><a href="https://blog.csdn.net/u014527058/article/details/79667458" target="_blank">https://blog.csdn.net/u014527058/article/details/79667458</a><br /><br />SpringBoot Logback 配置参数迁移到配置中心 Apollo<br /><a href="https://blog.csdn.net/shuaizai88/article/details/83027262" target="_blank">https://blog.csdn.net/shuaizai88/article/details/83027262</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/434914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-11-19 15:14 <a href="http://www.blogjava.net/paulwong/archive/2019/11/19/434914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring-loaded热部署</title><link>http://www.blogjava.net/paulwong/archive/2016/09/11/431784.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 11 Sep 2016 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2016/09/11/431784.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/431784.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2016/09/11/431784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/431784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/431784.html</trackback:ping><description><![CDATA[什么是spring-loaded?<br />
<br />
spring-loaded是一个对于jvm代理运行时期改变类文件的重载（重新加载），它转换类loadtime让他们服从后重新加载。不像&#8220;热代码替换&#8221;只允许一次简单的改变JVM运行(例如更改方法体)spring-loaded允许您添加/修改/删除/字段/方法构造函数。注释类型/方法/字段/构造函数也可以修改和可以添加/删除/修改值的枚举类型。<br />
<br />
有什么好处?<br />
<br />
开发测试阶段：能够在启动后动态更改代码调试,无需重启减少切换debug时间（ps:对于eclipse而言，在debug时期只能做到动态更新方法体不能增加）<br />
对于线上测试发布阶段： 能够在出现问题后直接替换class文件而不重启应用（ps:对于外部提供的服务jar形式同样能做到）<br />
怎么使用?<br />
<br />
项目地址<br />
<br />
<a href="https://github.com/spring-projects/spring-loaded" target="_blank">https://github.com/spring-projects/spring-loaded</a>
<br /><br />第一步：下载文件<br /><a href="http://repo.spring.io/release/org/springframework/springloaded/1.2.5.RELEASE/springloaded-1.2.5.RELEASE.jar" target="_blank">http://repo.spring.io/release/org/springframework/springloaded/1.2.5.RELEASE/springloaded-1.2.5.RELEASE.jar</a><br /><br />第二步：配置jvm启动参数<br /><br />eclipse<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->eclipse：run&nbsp;as&nbsp;--&gt;&nbsp;run&nbsp;configurations&nbsp;--&gt;&nbsp;arguments&nbsp;--&gt;&gt;&nbsp;VM&nbsp;arguments<br />-javaagent:E:\repository\org\springframework\spring-load\springloaded-1.2.5.RELEASE.jar&nbsp;<br />-noverify&nbsp;-Dspringloaded=verbose<br />详细描述：<br />-javaagent:&nbsp;配置java代理使用下载后的jar包路径<br />-noverify:&nbsp;禁用字节码验证<br />-Dspringloaded=verbose&nbsp;显示springloaded时的详细信息</div><br /><br /><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px; color: #3d464d; font-family: &quot;Pingfang SC&quot;, STHeiti, &quot;Lantinghei SC&quot;, &quot;Open Sans&quot;, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, &quot;WenQuanYi Micro Hei&quot;, SimSun, sans-serif; font-size: 16px; line-height: 30px;"><img src="https://cloud.githubusercontent.com/assets/9413389/18079968/ef143758-6ec5-11e6-8a72-ab3cd30b4af9.png" alt="image" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; border: none; margin: auto; max-width: 80%; height: auto;" /></p><h4>java命令启动</h4><pre css"="" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; overflow-x: auto; padding: 2px; color: #777777; border-radius: 3px; line-height: 1.4; word-wrap: normal; background: #fdf6e3;"><code css"="" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; display: block; overflow-x: auto; padding: 10px; border-radius: 4px; line-height: 1.4; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">java</span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">-javaagent</span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #cb4b16;">:E</span>:\<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">repository</span>\<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">org</span>\<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">springframework</span>\<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">spring-load</span>\<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">springloaded-1</span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #268bd2;">.2</span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #268bd2;">.5</span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #268bd2;">.RELEASE</span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #268bd2;">.jar</span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">-noverify</span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">Test</span>  类似 </code></pre><h4>java jar包动态替换</h4><h5>1.打成runnable Jar</h5><h5>2.命令启动：</h5><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px; color: #3d464d; font-family: &quot;Pingfang SC&quot;, STHeiti, &quot;Lantinghei SC&quot;, &quot;Open Sans&quot;, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, &quot;WenQuanYi Micro Hei&quot;, SimSun, sans-serif; font-size: 16px; line-height: 30px;">java -javaagent:E:\repository\org\springframework\spring-load\springloaded-1.2.5.RELEASE.jar -noverify -Dspringloaded=watchJars=main.jar main.jar</p><pre java"="" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; overflow-x: auto; padding: 2px; color: #777777; border-radius: 3px; line-height: 1.4; word-wrap: normal; background: #fdf6e3;"><code java"="" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; display: block; overflow-x: auto; padding: 10px; border-radius: 4px; line-height: 1.4; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #93a1a1;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">/**  * 类Test.java的实现描述：TODO 类实现描述   * </span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #2aa198;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #93a1a1;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #2aa198;">@author</span></span></span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"> Administrator 2016年7月4日 下午4:55:59  */</span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">public</span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">class</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #b58900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">Test</span></span></span> </span>{     <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">public</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">static</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">void</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #268bd2;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">main</span></span></span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">(String[] args)</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">throws</span></span></span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"> InterruptedException </span></span>{          <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">while</span>(<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">true</span>) {             <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">try</span> {                 println();                 Thread.sleep(<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #2aa198;">1000</span>);             } <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">catch</span> (Throwable e) {                  e.printStackTrace();              }          }       }     <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">public</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">static</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">void</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #268bd2;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">println</span></span></span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">()</span></span></span> </span>{          System.out.println(<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #2aa198;">"112222221222222"</span>);          }  } </code></pre><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px; color: #3d464d; font-family: &quot;Pingfang SC&quot;, STHeiti, &quot;Lantinghei SC&quot;, &quot;Open Sans&quot;, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, &quot;WenQuanYi Micro Hei&quot;, SimSun, sans-serif; font-size: 16px; line-height: 30px;">改变为</p><pre java"="" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; overflow-x: auto; padding: 2px; color: #777777; border-radius: 3px; line-height: 1.4; word-wrap: normal; background: #fdf6e3;"><code java"="" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; display: block; overflow-x: auto; padding: 10px; border-radius: 4px; line-height: 1.4; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #93a1a1;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">/**  * 类Test.java的实现描述：TODO 类实现描述   * </span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #2aa198;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #93a1a1;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #2aa198;">@author</span></span></span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"> Administrator 2016年7月4日 下午4:55:59  */</span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">public</span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">class</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #b58900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">Test</span></span></span> </span>{     <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">public</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">static</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">void</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #268bd2;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">main</span></span></span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">(String[] args)</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">throws</span></span></span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"> InterruptedException </span></span>{          <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">while</span>(<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">true</span>) {             <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">try</span> {                 println();                 Thread.sleep(<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #2aa198;">1000</span>);             } <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;">catch</span> (Throwable e) {                  e.printStackTrace();              }          }       }     <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">public</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">static</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #859900;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">void</span></span></span> <span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #268bd2;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">println</span></span></span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">()</span></span></span> </span>{          System.out.println(<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #2aa198;">"test replace jar"</span>);          }  } </code></pre><h5>3.重新打包替换</h5><pre javascript"="" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; overflow-x: auto; padding: 2px; color: #777777; border-radius: 3px; line-height: 1.4; word-wrap: normal; background: #fdf6e3;"><code javascript"="" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; display: block; overflow-x: auto; padding: 10px; border-radius: 4px; line-height: 1.4; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">PS：实测在<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #dc322f;">window</span>下无用 手上无linux机器待测试</code></pre><br /><br /><br /><br />1<img src ="http://www.blogjava.net/paulwong/aggbug/431784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2016-09-11 10:40 <a href="http://www.blogjava.net/paulwong/archive/2016/09/11/431784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING MVC整合NETTY</title><link>http://www.blogjava.net/paulwong/archive/2016/04/19/430146.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 19 Apr 2016 05:27:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2016/04/19/430146.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/430146.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2016/04/19/430146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/430146.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/430146.html</trackback:ping><description><![CDATA[<a href="http://wenku.baidu.com/view/4573aba4ce2f0066f53322e8.html" target="_blank">http://wenku.baidu.com/view/4573aba4ce2f0066f53322e8.html</a><img src ="http://www.blogjava.net/paulwong/aggbug/430146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2016-04-19 13:27 <a href="http://www.blogjava.net/paulwong/archive/2016/04/19/430146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING IO</title><link>http://www.blogjava.net/paulwong/archive/2015/10/30/427986.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 30 Oct 2015 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/10/30/427986.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/427986.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/10/30/427986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/427986.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/427986.html</trackback:ping><description><![CDATA[Spring起初只专注ioc和aop，现在已发展成一个庞大体系。比如security、mvc等。<br />如此一来，不同模块或者与外部进行集成时，依赖处理就需要各自对应版本号。<br />比如，较新spring与较老的quartz，它们集成就会遇到问题，给搭建和升级带来不便。<br /><br />因此Spring IO Platform应运而生，只要项目中引入了它，外部集成时依赖关系无需版本号<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-core<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>&nbsp;<br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span></div><br />Spring IO Platform只是一个pom文件，记录了spring与其他开源项目对应的版本。<br />省去了版本号，也就省去了处理依赖时的问题，因为Spring IO Platform中有最优的版本。<img src ="http://www.blogjava.net/paulwong/aggbug/427986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-10-30 14:05 <a href="http://www.blogjava.net/paulwong/archive/2015/10/30/427986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring面试问答Top 25</title><link>http://www.blogjava.net/paulwong/archive/2015/04/30/424783.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 30 Apr 2015 05:29:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/04/30/424783.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/424783.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/04/30/424783.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/424783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/424783.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 问题清单：什么是Spring框架？Spring框架有哪些主要模块？使用Spring框架有什么好处？什么是控制反转（IOC）？什么是依赖注入？请解释下Spring中的IOC？BeanFactory和ApplicationContext有什么区别？将Spring配置到你的应用中共有几种方法？什么基于XML的配置？什么基Java的配置？怎样用注解的方式配置Spring？描述Spring Bean的生命周...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2015/04/30/424783.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/424783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-04-30 13:29 <a href="http://www.blogjava.net/paulwong/archive/2015/04/30/424783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING CACHE之ConcurrentMapCacheManager改造</title><link>http://www.blogjava.net/paulwong/archive/2015/02/25/423034.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 25 Feb 2015 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/02/25/423034.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/423034.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/02/25/423034.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/423034.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/423034.html</trackback:ping><description><![CDATA[ConcurrentMapCacheManager可以作为一种缓存方案，但不能设置过期，最大缓存条目等，需进行改造。<br />
<ol>
     <li>pom.xml中加入依赖包<br />
     <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>com.google.guava<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>guava<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span>18.0<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span></div>
     <br />
     </li>
     <li>改造CacheManager，MyConcurrentMapCacheManager<br />
     <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;com.paul.common.cache;<br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;Copyright&nbsp;2002-2014&nbsp;the&nbsp;original&nbsp;author&nbsp;or&nbsp;authors.<br />&nbsp;*<br />&nbsp;*&nbsp;Licensed&nbsp;under&nbsp;the&nbsp;Apache&nbsp;License,&nbsp;Version&nbsp;2.0&nbsp;(the&nbsp;"License");<br />&nbsp;*&nbsp;you&nbsp;may&nbsp;not&nbsp;use&nbsp;this&nbsp;file&nbsp;except&nbsp;in&nbsp;compliance&nbsp;with&nbsp;the&nbsp;License.<br />&nbsp;*&nbsp;You&nbsp;may&nbsp;obtain&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;License&nbsp;at<br />&nbsp;*<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.apache.org/licenses/LICENSE-2.0</span><span style="color: #008000; "><br />&nbsp;*<br />&nbsp;*&nbsp;Unless&nbsp;required&nbsp;by&nbsp;applicable&nbsp;law&nbsp;or&nbsp;agreed&nbsp;to&nbsp;in&nbsp;writing,&nbsp;software<br />&nbsp;*&nbsp;distributed&nbsp;under&nbsp;the&nbsp;License&nbsp;is&nbsp;distributed&nbsp;on&nbsp;an&nbsp;"AS&nbsp;IS"&nbsp;BASIS,<br />&nbsp;*&nbsp;WITHOUT&nbsp;WARRANTIES&nbsp;OR&nbsp;CONDITIONS&nbsp;OF&nbsp;ANY&nbsp;KIND,&nbsp;either&nbsp;express&nbsp;or&nbsp;implied.<br />&nbsp;*&nbsp;See&nbsp;the&nbsp;License&nbsp;for&nbsp;the&nbsp;specific&nbsp;language&nbsp;governing&nbsp;permissions&nbsp;and<br />&nbsp;*&nbsp;limitations&nbsp;under&nbsp;the&nbsp;License.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Collection;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Collections;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Map;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.ConcurrentHashMap;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.ConcurrentMap;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.TimeUnit;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.cache.Cache;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.cache.CacheManager;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.cache.concurrent.ConcurrentMapCache;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.google.common.cache.CacheBuilder;<br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;CacheManager}&nbsp;implementation&nbsp;that&nbsp;lazily&nbsp;builds&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;ConcurrentMapCache}<br />&nbsp;*&nbsp;instances&nbsp;for&nbsp;each&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;#getCache}&nbsp;request.&nbsp;Also&nbsp;supports&nbsp;a&nbsp;'static'&nbsp;mode&nbsp;where<br />&nbsp;*&nbsp;the&nbsp;set&nbsp;of&nbsp;cache&nbsp;names&nbsp;is&nbsp;pre-defined&nbsp;through&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;#setCacheNames},&nbsp;with&nbsp;no<br />&nbsp;*&nbsp;dynamic&nbsp;creation&nbsp;of&nbsp;further&nbsp;cache&nbsp;regions&nbsp;at&nbsp;runtime.<br />&nbsp;*<br />&nbsp;*&nbsp;&lt;p&gt;Note:&nbsp;This&nbsp;is&nbsp;by&nbsp;no&nbsp;means&nbsp;a&nbsp;sophisticated&nbsp;CacheManager;&nbsp;it&nbsp;comes&nbsp;with&nbsp;no<br />&nbsp;*&nbsp;cache&nbsp;configuration&nbsp;options.&nbsp;However,&nbsp;it&nbsp;may&nbsp;be&nbsp;useful&nbsp;for&nbsp;testing&nbsp;or&nbsp;simple<br />&nbsp;*&nbsp;caching&nbsp;scenarios.&nbsp;For&nbsp;advanced&nbsp;local&nbsp;caching&nbsp;needs,&nbsp;consider<br />&nbsp;*&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;org.springframework.cache.guava.GuavaCacheManager}&nbsp;or<br />&nbsp;*&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;org.springframework.cache.ehcache.EhCacheCacheManager}.<br />&nbsp;*<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Juergen&nbsp;Hoeller<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@since</span><span style="color: #008000; ">&nbsp;3.1<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@see</span><span style="color: #008000; ">&nbsp;ConcurrentMapCache<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyConcurrentMapCacheManager&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;CacheManager&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;ConcurrentMap&lt;String,&nbsp;Cache&gt;&nbsp;cacheMap&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConcurrentHashMap&lt;String,&nbsp;Cache&gt;(16);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;dynamic&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;allowNullValues&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;expireTime&nbsp;=&nbsp;30;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;maximumSize&nbsp;=&nbsp;100;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Construct&nbsp;a&nbsp;dynamic&nbsp;ConcurrentMapCacheManager,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;lazily&nbsp;creating&nbsp;cache&nbsp;instances&nbsp;as&nbsp;they&nbsp;are&nbsp;being&nbsp;requested.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;MyConcurrentMapCacheManager()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Construct&nbsp;a&nbsp;static&nbsp;ConcurrentMapCacheManager,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;managing&nbsp;caches&nbsp;for&nbsp;the&nbsp;specified&nbsp;cache&nbsp;names&nbsp;only.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;MyConcurrentMapCacheManager(<span style="color: #0000FF; ">long</span>&nbsp;expireTime,&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;maximumSize)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(expireTime&nbsp;&gt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.expireTime&nbsp;=&nbsp;expireTime;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(maximumSize&nbsp;&gt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.maximumSize&nbsp;=&nbsp;maximumSize;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Specify&nbsp;the&nbsp;set&nbsp;of&nbsp;cache&nbsp;names&nbsp;for&nbsp;this&nbsp;CacheManager's&nbsp;'static'&nbsp;mode.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;p&gt;The&nbsp;number&nbsp;of&nbsp;caches&nbsp;and&nbsp;their&nbsp;names&nbsp;will&nbsp;be&nbsp;fixed&nbsp;after&nbsp;a&nbsp;call&nbsp;to&nbsp;this&nbsp;method,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;with&nbsp;no&nbsp;creation&nbsp;of&nbsp;further&nbsp;cache&nbsp;regions&nbsp;at&nbsp;runtime.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;p&gt;Calling&nbsp;this&nbsp;with&nbsp;a&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;null}&nbsp;collection&nbsp;argument&nbsp;resets&nbsp;the<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;mode&nbsp;to&nbsp;'dynamic',&nbsp;allowing&nbsp;for&nbsp;further&nbsp;creation&nbsp;of&nbsp;caches&nbsp;again.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setCacheNames(Collection&lt;String&gt;&nbsp;cacheNames)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(cacheNames&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(String&nbsp;name&nbsp;:&nbsp;cacheNames)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.cacheMap.put(name,&nbsp;createConcurrentMapCache(name));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.dynamic&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.dynamic&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Specify&nbsp;whether&nbsp;to&nbsp;accept&nbsp;and&nbsp;convert&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;null}&nbsp;values&nbsp;for&nbsp;all&nbsp;caches<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;in&nbsp;this&nbsp;cache&nbsp;manager.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;p&gt;Default&nbsp;is&nbsp;"true",&nbsp;despite&nbsp;ConcurrentHashMap&nbsp;itself&nbsp;not&nbsp;supporting&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;null}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;values.&nbsp;An&nbsp;internal&nbsp;holder&nbsp;object&nbsp;will&nbsp;be&nbsp;used&nbsp;to&nbsp;store&nbsp;user-level&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;null}s.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;p&gt;Note:&nbsp;A&nbsp;change&nbsp;of&nbsp;the&nbsp;null-value&nbsp;setting&nbsp;will&nbsp;reset&nbsp;all&nbsp;existing&nbsp;caches,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;if&nbsp;any,&nbsp;to&nbsp;reconfigure&nbsp;them&nbsp;with&nbsp;the&nbsp;new&nbsp;null-value&nbsp;requirement.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setAllowNullValues(<span style="color: #0000FF; ">boolean</span>&nbsp;allowNullValues)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(allowNullValues&nbsp;!=&nbsp;<span style="color: #0000FF; ">this</span>.allowNullValues)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.allowNullValues&nbsp;=&nbsp;allowNullValues;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Need&nbsp;to&nbsp;recreate&nbsp;all&nbsp;Cache&nbsp;instances&nbsp;with&nbsp;the&nbsp;new&nbsp;null-value&nbsp;configuration<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(Map.Entry&lt;String,&nbsp;Cache&gt;&nbsp;entry&nbsp;:&nbsp;<span style="color: #0000FF; ">this</span>.cacheMap.entrySet())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entry.setValue(createConcurrentMapCache(entry.getKey()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Return&nbsp;whether&nbsp;this&nbsp;cache&nbsp;manager&nbsp;accepts&nbsp;and&nbsp;converts&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;null}&nbsp;values<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;for&nbsp;all&nbsp;of&nbsp;its&nbsp;caches.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;isAllowNullValues()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>.allowNullValues;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Collection&lt;String&gt;&nbsp;getCacheNames()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Collections.unmodifiableSet(<span style="color: #0000FF; ">this</span>.cacheMap.keySet());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Cache&nbsp;getCache(String&nbsp;name)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cache&nbsp;cache&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.cacheMap.get(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(cache&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;<span style="color: #0000FF; ">this</span>.dynamic)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">synchronized</span>&nbsp;(<span style="color: #0000FF; ">this</span>.cacheMap)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.cacheMap.get(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(cache&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache&nbsp;=&nbsp;createConcurrentMapCache(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.cacheMap.put(name,&nbsp;cache);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cache;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Create&nbsp;a&nbsp;new&nbsp;ConcurrentMapCache&nbsp;instance&nbsp;for&nbsp;the&nbsp;specified&nbsp;cache&nbsp;name.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;name&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;cache<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;the&nbsp;ConcurrentMapCache&nbsp;(or&nbsp;a&nbsp;decorator&nbsp;thereof)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;Cache&nbsp;createConcurrentMapCache(String&nbsp;name)&nbsp;{<br /><span style="color: #008000; ">&nbsp; &nbsp; &nbsp; &nbsp; //</span><span style="color: #008000; ">return&nbsp;new&nbsp;ConcurrentMapCache(name,&nbsp;isAllowNullValues());<br /></span><span style="color: #008000; ">&nbsp; &nbsp; &nbsp; &nbsp; //</span><span style="color: #008000; ">此处改用GOOGLE&nbsp;GUAVA的构造MANAGER方式</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConcurrentMapCache(name,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CacheBuilder.newBuilder()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.expireAfterWrite(<span style="color: #0000FF; ">this</span>.expireTime,&nbsp;TimeUnit.MINUTES)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.maximumSize(<span style="color: #0000FF; ">this</span>.maximumSize)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.build()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.asMap(),&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isAllowNullValues());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br />
     <br />
     </li>
     <li>配置想着bean, cache-concurrentmap-applicationcontext.xml<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; ">&nbsp;xmlns:context</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/context"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:cache</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/cache"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:p</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/p"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:c</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/c"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:jee</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/jee"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:util</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/util"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/context<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context/spring-context-3.0.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/cache<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/cache/spring-cache.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/jee&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/jee/spring-jee.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/util<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/util/spring-util.xsd"</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">cache:annotation-driven&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;&lt;bean&nbsp;id="cacheManager"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class="org.springframework.cache.concurrent.ConcurrentMapCacheManager"&nbsp;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="cacheNames"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;my-local-cache&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/bean&gt;&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="cacheManager"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000FF; ">="com.paul.common.cache.MyConcurrentMapCacheManager"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">constructor-arg&nbsp;</span><span style="color: #FF0000; ">index</span><span style="color: #0000FF; ">="0"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">constructor-arg&nbsp;</span><span style="color: #FF0000; ">index</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="5000"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">beans</span><span style="color: #0000FF; ">&gt;</span></div>
     <br />
     <br />
     </li>
     <li>通过注释进行使用<br />
     <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;JBoss,&nbsp;Home&nbsp;of&nbsp;Professional&nbsp;Open&nbsp;Source<br />&nbsp;*&nbsp;Copyright&nbsp;2014,&nbsp;Red&nbsp;Hat,&nbsp;Inc.&nbsp;and/or&nbsp;its&nbsp;affiliates,&nbsp;and&nbsp;individual<br />&nbsp;*&nbsp;contributors&nbsp;by&nbsp;the&nbsp;@authors&nbsp;tag.&nbsp;See&nbsp;the&nbsp;copyright.txt&nbsp;in&nbsp;the<br />&nbsp;*&nbsp;distribution&nbsp;for&nbsp;a&nbsp;full&nbsp;listing&nbsp;of&nbsp;individual&nbsp;contributors.<br />&nbsp;*<br />&nbsp;*&nbsp;Licensed&nbsp;under&nbsp;the&nbsp;Apache&nbsp;License,&nbsp;Version&nbsp;2.0&nbsp;(the&nbsp;"License");<br />&nbsp;*&nbsp;you&nbsp;may&nbsp;not&nbsp;use&nbsp;this&nbsp;file&nbsp;except&nbsp;in&nbsp;compliance&nbsp;with&nbsp;the&nbsp;License.<br />&nbsp;*&nbsp;You&nbsp;may&nbsp;obtain&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;License&nbsp;at<br />&nbsp;*&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.apache.org/licenses/LICENSE-2.0</span><span style="color: #008000; "><br />&nbsp;*&nbsp;Unless&nbsp;required&nbsp;by&nbsp;applicable&nbsp;law&nbsp;or&nbsp;agreed&nbsp;to&nbsp;in&nbsp;writing,&nbsp;software<br />&nbsp;*&nbsp;distributed&nbsp;under&nbsp;the&nbsp;License&nbsp;is&nbsp;distributed&nbsp;on&nbsp;an&nbsp;"AS&nbsp;IS"&nbsp;BASIS,<br />&nbsp;*&nbsp;WITHOUT&nbsp;WARRANTIES&nbsp;OR&nbsp;CONDITIONS&nbsp;OF&nbsp;ANY&nbsp;KIND,&nbsp;either&nbsp;express&nbsp;or&nbsp;implied.<br />&nbsp;*&nbsp;See&nbsp;the&nbsp;License&nbsp;for&nbsp;the&nbsp;specific&nbsp;language&nbsp;governing&nbsp;permissions&nbsp;and<br />&nbsp;*&nbsp;limitations&nbsp;under&nbsp;the&nbsp;License.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">package</span>&nbsp;com.paul.springmvc.data;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;javax.persistence.EntityManager;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.persistence.criteria.CriteriaBuilder;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.persistence.criteria.CriteriaQuery;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.persistence.criteria.Root;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.cache.annotation.CacheEvict;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.cache.annotation.Cacheable;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Repository;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.transaction.annotation.Transactional;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.paul.springmvc.model.Member;<br /><br />@Repository<br />@Transactional<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MemberDaoImpl&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;MemberDao&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;EntityManager&nbsp;em;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Cacheable(value&nbsp;=&nbsp;"my-local-cache",&nbsp;key&nbsp;=&nbsp;"#id")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Member&nbsp;findById(Long&nbsp;id)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />MemberDaoImpl&nbsp;NO&nbsp;CACHE<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;em.find(Member.<span style="color: #0000FF; ">class</span>,&nbsp;id);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Member&nbsp;findByEmail(String&nbsp;email)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CriteriaBuilder&nbsp;cb&nbsp;=&nbsp;em.getCriteriaBuilder();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CriteriaQuery&lt;Member&gt;&nbsp;criteria&nbsp;=&nbsp;cb.createQuery(Member.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Root&lt;Member&gt;&nbsp;member&nbsp;=&nbsp;criteria.from(Member.<span style="color: #0000FF; ">class</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Swap&nbsp;criteria&nbsp;statements&nbsp;if&nbsp;you&nbsp;would&nbsp;like&nbsp;to&nbsp;try&nbsp;out&nbsp;type-safe&nbsp;criteria&nbsp;queries,&nbsp;a&nbsp;new<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;feature&nbsp;in&nbsp;JPA&nbsp;2.0&nbsp;criteria.select(member).orderBy(cb.asc(member.get(Member_.name)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.select(member).where(cb.equal(member.get("email"),&nbsp;email));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;em.createQuery(criteria).getSingleResult();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;List&lt;Member&gt;&nbsp;findAllOrderedByName()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CriteriaBuilder&nbsp;cb&nbsp;=&nbsp;em.getCriteriaBuilder();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CriteriaQuery&lt;Member&gt;&nbsp;criteria&nbsp;=&nbsp;cb.createQuery(Member.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Root&lt;Member&gt;&nbsp;member&nbsp;=&nbsp;criteria.from(Member.<span style="color: #0000FF; ">class</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Swap&nbsp;criteria&nbsp;statements&nbsp;if&nbsp;you&nbsp;would&nbsp;like&nbsp;to&nbsp;try&nbsp;out&nbsp;type-safe&nbsp;criteria&nbsp;queries,&nbsp;a&nbsp;new<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;feature&nbsp;in&nbsp;JPA&nbsp;2.0&nbsp;criteria.select(member).orderBy(cb.asc(member.get(Member_.name)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.select(member).orderBy(cb.asc(member.get("name")));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;em.createQuery(criteria).getResultList();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@CacheEvict(value="my-local-cache",allEntries=<span style="color: #0000FF; ">true</span>,beforeInvocation=<span style="color: #0000FF; ">true</span>)<span style="color: #008000; ">//</span><span style="color: #008000; ">清空所有缓存</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;register(Member&nbsp;member)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.persist(member);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></li>
</ol><img src ="http://www.blogjava.net/paulwong/aggbug/423034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-02-25 16:34 <a href="http://www.blogjava.net/paulwong/archive/2015/02/25/423034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING CACHE资源</title><link>http://www.blogjava.net/paulwong/archive/2015/02/25/423032.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 25 Feb 2015 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/02/25/423032.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/423032.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/02/25/423032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/423032.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/423032.html</trackback:ping><description><![CDATA[SPRING手册<a href="http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/htmlsingle/#cache" target="_blank"><br />http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/htmlsingle/#cache</a><br /><br />SPRING CONCURRENTMAP MANAGER加过期策略<br /><a href="http://stackoverflow.com/questions/8181768/can-i-set-a-ttl-for-cacheable" target="_blank">http://stackoverflow.com/questions/8181768/can-i-set-a-ttl-for-cacheable</a><br /><br />组合KEY<br /><a href="http://stackoverflow.com/questions/14072380/cacheable-key-on-multiple-method-arguments" target="_blank">http://stackoverflow.com/questions/14072380/cacheable-key-on-multiple-method-arguments</a><br /><br />Spring Cache抽象详解<br /><a href="http://www.open-open.com/lib/view/open1389575623336.html" target="_blank">http://www.open-open.com/lib/view/open1389575623336.html</a><br /><br />注释驱动的 Spring cache 缓存介绍<br /><a href="https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/" target="_blank">https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/</a><br /><br /><h3><a href="http://jinnianshilongnian.iteye.com/blog/2001040" style="color: #e9650e;" target="_blank">Spring Cache抽象详解</a></h3><img src ="http://www.blogjava.net/paulwong/aggbug/423032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-02-25 16:04 <a href="http://www.blogjava.net/paulwong/archive/2015/02/25/423032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Architecture for Redis cache &amp; Mongo for persistence</title><link>http://www.blogjava.net/paulwong/archive/2015/01/04/422026.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 04 Jan 2015 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/01/04/422026.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/422026.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/01/04/422026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/422026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/422026.html</trackback:ping><description><![CDATA[Caching with Spring Data Redis<br /><a href="http://www.javacodegeeks.com/2013/02/caching-with-spring-data-redis.html" target="_blank">http://www.javacodegeeks.com/2013/02/caching-with-spring-data-redis.html</a><br /><br />Architecture for Redis cache &amp; Mongo for persistence<br /><a href="http://stackoverflow.com/questions/11218941/architecture-for-redis-cache-mongo-for-persistence" target="_blank">http://stackoverflow.com/questions/11218941/architecture-for-redis-cache-mongo-for-persistence</a><br /><br />MongoDB with redis<br /><a href="http://stackoverflow.com/questions/10696463/mongodb-with-redis/10721249#10721249" target="_blank">http://stackoverflow.com/questions/10696463/mongodb-with-redis/10721249#10721249</a><br /><br />Caching Data in Spring Using Redis<br /><a href="http://caseyscarborough.com/blog/2014/12/18/caching-data-in-spring-using-redis/" target="_blank">http://caseyscarborough.com/blog/2014/12/18/caching-data-in-spring-using-redis/</a><br /><br />Springside Redis<br /><a href="https://github.com/springside/springside4/wiki/Redis" target="_blank">https://github.com/springside/springside4/wiki/Redis</a><br /><br />Spring Cache注解+Redis<br /><a href="http://hanqunfeng.iteye.com/blog/2176172" target="_blank">http://hanqunfeng.iteye.com/blog/2176172</a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/422026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-01-04 15:50 <a href="http://www.blogjava.net/paulwong/archive/2015/01/04/422026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING-SESSION</title><link>http://www.blogjava.net/paulwong/archive/2014/11/19/420309.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 19 Nov 2014 10:23:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/11/19/420309.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/420309.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/11/19/420309.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/420309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/420309.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HTTP SESSION的管理通常是由容器来做，但如果是在PAAS环境下，服务器不能做变更，则需要由WEB应用来做处理HTTP SESSION。同样，如果是分布式的环境下，SESSION的管理也会带来性能问题。SPRING推出了处理SESSION的框架：SPRING-SESSION。SPRING会重写HTTP SESSION的那一套，使用SESSION也同样还是用Code ...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2014/11/19/420309.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/420309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-11-19 18:23 <a href="http://www.blogjava.net/paulwong/archive/2014/11/19/420309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Boot</title><link>http://www.blogjava.net/paulwong/archive/2014/10/11/418634.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sat, 11 Oct 2014 12:34:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/10/11/418634.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/418634.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/10/11/418634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/418634.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/418634.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 15pt; padding: 0px; font-family: Verdana, sans-serif, 宋体; line-height: 22.3999996185303px; background-color: #ffffff;">&nbsp;Spring Boot 在 Spring 生态中的位置：</p><p style="margin: 0px 0px 15pt; padding: 0px; font-family: Verdana, sans-serif, 宋体; line-height: 22.3999996185303px; background-color: #ffffff;"><img src="http://static.oschina.net/uploads/img/201308/07075532_re21.png" alt="Spring Boot in Context" style="margin: 0px 0px 0px 60px; padding: 0px; border: 0px; max-width: 640px;" /><br /><br /><a href="https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples" target="_blank">https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples</a><br /></p><img src ="http://www.blogjava.net/paulwong/aggbug/418634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-10-11 20:34 <a href="http://www.blogjava.net/paulwong/archive/2014/10/11/418634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring对HttpSession的重新封闭</title><link>http://www.blogjava.net/paulwong/archive/2014/08/19/417090.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 19 Aug 2014 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/08/19/417090.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/417090.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/08/19/417090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/417090.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/417090.html</trackback:ping><description><![CDATA[<a href="https://github.com/spring-projects/spring-session/tree/master/samples" target="_blank">https://github.com/spring-projects/spring-session/tree/master/samples</a><img src ="http://www.blogjava.net/paulwong/aggbug/417090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-08-19 09:13 <a href="http://www.blogjava.net/paulwong/archive/2014/08/19/417090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自定义注释与操作行为记录</title><link>http://www.blogjava.net/paulwong/archive/2014/07/25/416201.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 25 Jul 2014 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/07/25/416201.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/416201.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/07/25/416201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/416201.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/416201.html</trackback:ping><description><![CDATA[<div>自定义注释就是一个标记，一个信息收集器，如果配合SPRING的AOP使用，可以记录用户的操作行为。<br />
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">import</span>&nbsp;java.lang.annotation.ElementType;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.lang.annotation.Retention;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.lang.annotation.RetentionPolicy;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.lang.annotation.Target;<br />
<br />
<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;新增的用法:@Audit(behaviour="新增了专题",&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value="#{args[0].colSubject}")<br />
&nbsp;*<br />
&nbsp;*&nbsp;修改的用法:@Audit(behaviour="修改了专题",&nbsp;id="#{args[0].colSubject.id}",&nbsp;<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;className="com.paul.program.colsubject.valueobject.ColSubject",<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value="#{args[0].colSubject}")<br />
&nbsp;*<br />
&nbsp;*&nbsp;删除的用法:@Audit(behaviour="删除了专题",&nbsp;id="#{args[0].colSubject.id}"<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;className="com.paul.program.colsubject.valueobject.ColSubject")<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;PAUL<br />
&nbsp;*<br />
&nbsp;</span><span style="color: #008000; ">*/</span><br />
@Retention(RetentionPolicy.RUNTIME)<br />
@Target(ElementType.METHOD)<br />
<span style="color: #0000FF; ">public</span>&nbsp;@<span style="color: #0000FF; ">interface</span>&nbsp;Audit&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;id()&nbsp;<span style="color: #0000FF; ">default</span>&nbsp;"";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;className()&nbsp;<span style="color: #0000FF; ">default</span>&nbsp;"";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;collectionName()&nbsp;<span style="color: #0000FF; ">default</span>&nbsp;"";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value()&nbsp;<span style="color: #0000FF; ">default</span>&nbsp;"";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;behaviour();<br />
<br />
}</div>
</div>
<br />
<br />
值对象<br />
AuditData.java<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span>&nbsp;com.paul.common.audit;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.io.Serializable;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.util.Date;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.codehaus.jackson.annotate.JsonProperty;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.codehaus.jackson.map.annotate.JsonSerialize;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.annotation.CreatedBy;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.annotation.CreatedDate;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.annotation.Id;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.core.mapping.Document;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.core.mapping.Field;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.common.util.jackson.CustomJsonDateSerializer;<br />
<br />
@Document(collection&nbsp;=&nbsp;"auditdata")<br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;AuditData&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;Serializable{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;serialVersionUID&nbsp;=&nbsp;-4011585863836336249L;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@CreatedBy<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Field("userid")<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JsonProperty("userid")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;userId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@CreatedDate<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Field("createdate")<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JsonProperty("createdate")<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JsonSerialize(using&nbsp;=&nbsp;CustomJsonDateSerializer.<span style="color: #0000FF; ">class</span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Date&nbsp;createDate;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;behaviour;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Field("newvalue")<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JsonProperty("newvalue")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;newValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Field("oldvalue")<br />
&nbsp;&nbsp;&nbsp;&nbsp;@JsonProperty("oldvalue")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;oldValue;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setId(String&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.id&nbsp;=&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getUserId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;userId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setUserId(String&nbsp;userId)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.userId&nbsp;=&nbsp;userId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Date&nbsp;getCreateDate()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;createDate;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setCreateDate(Date&nbsp;createDate)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.createDate&nbsp;=&nbsp;createDate;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getBehaviour()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;behaviour;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setBehaviour(String&nbsp;behaviour)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.behaviour&nbsp;=&nbsp;behaviour;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getNewValue()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;newValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setNewValue(String&nbsp;newValue)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.newValue&nbsp;=&nbsp;newValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getOldValue()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;oldValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setOldValue(String&nbsp;oldValue)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.oldValue&nbsp;=&nbsp;oldValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;toString()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"AuditData&nbsp;[id="&nbsp;+&nbsp;id&nbsp;+&nbsp;",&nbsp;userId="&nbsp;+&nbsp;userId&nbsp;+&nbsp;",&nbsp;createDate="<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;createDate&nbsp;+&nbsp;",&nbsp;behaviour="&nbsp;+&nbsp;behaviour&nbsp;+&nbsp;",&nbsp;newValue="<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;newValue&nbsp;+&nbsp;",&nbsp;oldValue="&nbsp;+&nbsp;oldValue&nbsp;+&nbsp;"]";<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
}</div>
<br />
<br />
RootObject.java<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span>&nbsp;com.paul.common.audit;<br />
<br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;RootObject&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Object[]&nbsp;args;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Object&nbsp;invokedObject;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Object&nbsp;returned;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Throwable&nbsp;throwned;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;RootObject(Object&nbsp;invokedObject,&nbsp;Object[]&nbsp;args,&nbsp;Object&nbsp;returned,&nbsp;Throwable&nbsp;throwned)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.invokedObject&nbsp;=&nbsp;invokedObject;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.args&nbsp;=&nbsp;args;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.returned&nbsp;=&nbsp;returned;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.throwned&nbsp;=&nbsp;throwned;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Object[]&nbsp;getArgs()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;args;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Object&nbsp;getInvokedObject()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;invokedObject;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Object&nbsp;getReturned()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;returned;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Throwable&nbsp;getThrowned()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;throwned;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</div>
<br />
<br />
TemplateParserContext.java<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span>&nbsp;com.paul.common.audit;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.expression.ParserContext;<br />
<br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;TemplateParserContext&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;ParserContext&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getExpressionPrefix()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"#{";<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getExpressionSuffix()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"}";<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;isTemplate()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</div>
<br />
<br />
获取用户ID<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span>&nbsp;com.paul.common.audit.aware;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;javax.servlet.http.HttpServletRequest;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.Logger;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.LoggerFactory;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.domain.AuditorAware;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Component;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.context.request.RequestContextHolder;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.context.request.ServletRequestAttributes;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.common.constant.Constants;<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.program.account.valueobject.Account;<br />
<br />
@Component<br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyAppAuditor&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;AuditorAware&lt;String&gt;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Logger&nbsp;logger&nbsp;=&nbsp;LoggerFactory.getLogger(MyAppAuditor.<span style="color: #0000FF; ">class</span>);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;get&nbsp;your&nbsp;user&nbsp;name&nbsp;here</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getCurrentAuditor()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;=&nbsp;"N/A";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request&nbsp;=&nbsp;((ServletRequestAttributes)&nbsp;RequestContextHolder<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getRequestAttributes()).getRequest();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Account&nbsp;account&nbsp;=&nbsp;(Account)request.getSession().getAttribute(Constants.USER_INFO);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;account.getLoginName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(e.getMessage(),&nbsp;e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</div>
<br />
<br />
切面<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span>&nbsp;com.paul.common.audit.interceptor;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.text.SimpleDateFormat;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.util.ArrayList;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.util.Date;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.util.Map;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.ConcurrentHashMap;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.TimeUnit;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.apache.commons.lang.builder.ToStringBuilder;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.apache.commons.lang.builder.ToStringStyle;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.aspectj.lang.ProceedingJoinPoint;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.aspectj.lang.annotation.Around;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.aspectj.lang.annotation.Aspect;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.Logger;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.LoggerFactory;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.core.MongoTemplate;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.expression.EvaluationException;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.expression.Expression;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.expression.ExpressionParser;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.expression.ParseException;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.expression.ParserContext;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.expression.spel.standard.SpelExpressionParser;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Component;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.common.audit.AuditData;<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.common.audit.AuditDataRequest;<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.common.audit.RootObject;<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.common.audit.TemplateParserContext;<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.common.audit.annotation.Audit;<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.common.audit.service.AuditDataService;<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.common.util.StringUtils;<br />
<br />
@Component<br />
@Aspect<br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;AuditAspect&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Logger&nbsp;logger&nbsp;=&nbsp;LoggerFactory.getLogger(AuditAspect.<span style="color: #0000FF; ">class</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;AuditDataService&nbsp;auditDataService;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;MongoTemplate&nbsp;mongoTemplate;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;SimpleDateFormat&nbsp;dateFormatPrototype&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SimpleDateFormat("yyyy-MM-dd&nbsp;HH:mm:ss");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Map&lt;String,&nbsp;Expression&gt;&nbsp;expressionCache&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConcurrentHashMap&lt;String,&nbsp;Expression&gt;();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;ExpressionParser&nbsp;expressionParser&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SpelExpressionParser();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;ParserContext&nbsp;parserContext&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;TemplateParserContext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;appendThrowableCauses(Throwable&nbsp;throwable,&nbsp;String&nbsp;separator,&nbsp;StringBuilder&nbsp;toAppendTo)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Throwable&gt;&nbsp;alreadyAppendedThrowables&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;Throwable&gt;();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(throwable&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;append</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toAppendTo.append(throwable.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alreadyAppendedThrowables.add(throwable);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;cause</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Throwable&nbsp;cause&nbsp;=&nbsp;throwable.getCause();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(cause&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;||&nbsp;alreadyAppendedThrowables.contains(cause))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throwable&nbsp;=&nbsp;cause;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toAppendTo.append(separator);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;getValueByEl(String&nbsp;template,&nbsp;Object&nbsp;invokedObject,&nbsp;Object[]&nbsp;args,&nbsp;Object&nbsp;returned,&nbsp;Throwable&nbsp;throwned)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;=&nbsp;"N/A";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(StringUtils.isBlank(template))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Expression&nbsp;expression&nbsp;=&nbsp;expressionCache.get(template);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(expression&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expression&nbsp;=&nbsp;expressionParser.parseExpression(template,&nbsp;parserContext);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expressionCache.put(template,&nbsp;expression);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;evaluatedMessage&nbsp;=&nbsp;expression.getValue(<span style="color: #0000FF; ">new</span>&nbsp;RootObject(invokedObject,&nbsp;args,&nbsp;returned,&nbsp;throwned),&nbsp;Object.<span style="color: #0000FF; ">class</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;evaluatedMessage.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(ParseException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(e.getMessage(),&nbsp;e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(EvaluationException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(e.getMessage(),&nbsp;e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;AuditData&nbsp;buildAuditData(Audit&nbsp;auditAnnotation,&nbsp;Object&nbsp;invokedObject,&nbsp;Object[]&nbsp;args,&nbsp;Object&nbsp;returned,&nbsp;Throwable&nbsp;throwned,&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;durationInNanos)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AuditData&nbsp;auditData&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;AuditData();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auditData.setBehaviour(auditAnnotation.behaviour());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;id&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.getValueByEl(auditAnnotation.id(),&nbsp;invokedObject,&nbsp;args,&nbsp;returned,&nbsp;throwned);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auditData.setOldValue(<span style="color: #0000FF; ">this</span>.getOldValueToString(id,&nbsp;auditAnnotation.className()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;newValue&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.getValueByEl(auditAnnotation.value(),&nbsp;invokedObject,&nbsp;args,&nbsp;returned,&nbsp;throwned);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auditData.setNewValue(newValue);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;msg&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StringBuilder();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleDateFormat&nbsp;simpleDateFormat&nbsp;=&nbsp;(SimpleDateFormat)&nbsp;dateFormatPrototype.clone();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg.append(simpleDateFormat.format(<span style="color: #0000FF; ">new</span>&nbsp;Date()));<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auditData.setCreateDate(simpleDateFormat.format(new&nbsp;Date()));</span><span style="color: #008000; "><br />
</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg.append("&nbsp;").append(newValue);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(throwned&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg.append("&nbsp;threw&nbsp;'");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appendThrowableCauses(throwned,&nbsp;",&nbsp;",&nbsp;msg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg.append("'");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg.append("&nbsp;by&nbsp;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;user&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.getUser();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(user&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user&nbsp;=&nbsp;"anonymous";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg.append("&nbsp;in&nbsp;")&nbsp;.append(TimeUnit.MILLISECONDS.convert(durationInNanos,&nbsp;TimeUnit.NANOSECONDS)).append("&nbsp;ms");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;auditData;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">StringBuilder&nbsp;msg&nbsp;=&nbsp;new&nbsp;StringBuilder("Exception&nbsp;evaluating&nbsp;template&nbsp;'"&nbsp;+&nbsp;template&nbsp;+&nbsp;"':&nbsp;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appendThrowableCauses(e,&nbsp;",&nbsp;",&nbsp;msg);</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;auditData;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;getOldValueToString(<span style="color: #008000; ">/*</span><span style="color: #008000; ">ProceedingJoinPoint&nbsp;proceedingJoinPoint,</span><span style="color: #008000; ">*/</span>&nbsp;String&nbsp;id,&nbsp;String&nbsp;className)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;=&nbsp;"N/A";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">String&nbsp;id&nbsp;=&nbsp;"5385be613d2a47eec07c53d4";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodSignature&nbsp;methodSig&nbsp;=&nbsp;(MethodSignature)&nbsp;proceedingJoinPoint.getSignature();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;target&nbsp;=&nbsp;proceedingJoinPoint.getTarget();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;newValue&nbsp;=&nbsp;proceedingJoinPoint.getArgs()[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;findMethodName&nbsp;=&nbsp;"findOne";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;oldValue=null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;findMethod&nbsp;=&nbsp;target.getClass().getDeclaredMethod(findMethodName,&nbsp;(Class&lt;?&gt;[])null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oldValue&nbsp;=&nbsp;findMethod.invoke(target,&nbsp;(Object[])&nbsp;null);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(e.getMessage(),&nbsp;e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(StringUtils.isBlank(id)&nbsp;||&nbsp;StringUtils.isBlank(className))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;object&nbsp;=&nbsp;mongoTemplate.findById(id,&nbsp;Class.forName(className));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;ToStringBuilder.reflectionToString(object,&nbsp;&nbsp;ToStringStyle.SHORT_PREFIX_STYLE);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(e.getMessage(),&nbsp;e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Around("execution(*&nbsp;com.paul..**.repository..*(..))")</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;@Around("@annotation(auditAnnotation)")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Object&nbsp;aroundAdvice(ProceedingJoinPoint&nbsp;proceedingJoinPoint,&nbsp;Audit&nbsp;auditAnnotation)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Throwable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;ok&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;o&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AuditData&nbsp;auditData&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auditData&nbsp;=&nbsp;buildAuditData(auditAnnotation,&nbsp;proceedingJoinPoint.getThis(),&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proceedingJoinPoint.getArgs(),&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o,&nbsp;<span style="color: #0000FF; ">null</span>,&nbsp;10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;=&nbsp;proceedingJoinPoint.proceed();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ok&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;o;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">finally</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ok)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;(MessageFormat.format(auditAnnotation.value(),&nbsp;proceedingJoinPoint.getArgs()));</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AuditDataRequest&nbsp;auditDataRequest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;AuditDataRequest();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auditDataRequest.setAuditData(auditData);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auditDataService.addAuditData(auditDataRequest);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(auditData&nbsp;+&nbsp;"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(e.getMessage(),&nbsp;e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;getUser()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"Paul";<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
}</div>
<br />
<br />
保存至数据库<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span>&nbsp;com.paul.common.audit.service;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.domain.Page;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Service;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.common.audit.AuditData;<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.common.audit.AuditDataRequest;<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.common.audit.annotation.Audit;<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.common.audit.repository.AuditDataRepository;<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.program.colsubject.valueobject.ColSubjectRequest;<br />
<br />
@Service<br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;AuditDataService&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;AuditDataRepository&nbsp;auditDataRepository;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Audited(message&nbsp;=&nbsp;"save(#{args[0].name},&nbsp;#{args[0].email}):&nbsp;#{returned?.id}")</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;@Audit(behaviour="修改了审计",&nbsp;id="#{args[0].colSubject.id}",&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;className="com.paul.program.colsubject.valueobject.ColSubject",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value="#{args[0].colSubject}")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;saveObject(ColSubjectRequest&nbsp;colSubjectRequest)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Audit(behaviour="删除了专题",&nbsp;id="#{args[0]}",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;className="com.paul.program.subject.valueobject.Subject")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;delete(String&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Audit(behaviour="新增了专题",&nbsp;value="#{args[0].colSubject}")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add(ColSubjectRequest&nbsp;colSubjectRequest)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;AuditData&nbsp;addAuditData(AuditDataRequest&nbsp;auditDataRequest)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;auditDataRepository.save(auditDataRequest.getAuditData());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Page&lt;AuditData&gt;&nbsp;findAll(AuditDataRequest&nbsp;auditDataRequest)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Page&lt;AuditData&gt;&nbsp;page&nbsp;=&nbsp;auditDataRepository.findAll(auditDataRequest.getPageable());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;page;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</div>
<br />
<br />
DAO<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span>&nbsp;com.paul.common.audit.repository;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.repository.PagingAndSortingRepository;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.common.audit.AuditData;<br />
<br />
<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;审计<br />
&nbsp;*&nbsp;<br />
&nbsp;</span><span style="color: #008000; ">*/</span><br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;AuditDataRepository&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;PagingAndSortingRepository&lt;AuditData,&nbsp;String&gt;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</div><img src ="http://www.blogjava.net/paulwong/aggbug/416201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-07-25 14:56 <a href="http://www.blogjava.net/paulwong/archive/2014/07/25/416201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Audit in Spring AOP</title><link>http://www.blogjava.net/paulwong/archive/2014/07/18/415969.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 18 Jul 2014 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/07/18/415969.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/415969.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/07/18/415969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/415969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/415969.html</trackback:ping><description><![CDATA[Auditing entities in Spring Data MongoDB<br /><a href="http://maciejwalkowiak.pl/blog/2013/05/24/auditing-entities-in-spring-data-mongodb/" target="_blank">http://maciejwalkowiak.pl/blog/2013/05/24/auditing-entities-in-spring-data-mongodb/</a><br /><br /><br />xebia-spring-security-extras<br /><a href="https://github.com/xebia-france/xebia-spring-security-extras/wiki/AuditedAnnotation" target="_blank">https://github.com/xebia-france/xebia-spring-security-extras/wiki/AuditedAnnotation</a><br /><br /><br />Spring Logging using custom annotation<br /><a href="http://stackoverflow.com/questions/15298164/spring-logging-using-custom-annotation" target="_blank">http://stackoverflow.com/questions/15298164/spring-logging-using-custom-annotation</a><br /><br /><br />Spring MVC and MongoDB - Auditing Actions<br /><a href="http://www.alexecollins.com/content/spring-mvc-and-mongodb-auditing-actions/" target="_blank">http://www.alexecollins.com/content/spring-mvc-and-mongodb-auditing-actions/</a><br /><br /><br />audit-aspectj&nbsp;<br /><a href="https://github.com/roghughe/captaindebug/tree/master/audit-aspectj" target="_blank">https://github.com/roghughe/captaindebug/tree/master/audit-aspectj</a><img src ="http://www.blogjava.net/paulwong/aggbug/415969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-07-18 09:50 <a href="http://www.blogjava.net/paulwong/archive/2014/07/18/415969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Data REST，Spring MVC的REST扩展</title><link>http://www.blogjava.net/paulwong/archive/2014/07/09/415635.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 09 Jul 2014 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/07/09/415635.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/415635.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/07/09/415635.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/415635.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/415635.html</trackback:ping><description><![CDATA[<a href="http://spring.io/blog/2012/06/26/spring-data-rest-1-0-0-rc1-released">http://spring.io/blog/2012/06/26/spring-data-rest-1-0-0-rc1-released</a><br /><br />RESTify your JPA Entities <br /><a href="https://www.openshift.com/blogs/restify-your-jpa-entities" target="_blank">https://www.openshift.com/blogs/restify-your-jpa-entities</a><br /><br />babdev-spring<br /><a href="https://github.com/gregorriegler/babdev-spring/tree/master/spring-data-rest" target="_blank">https://github.com/gregorriegler/babdev-spring/tree/master/spring-data-rest</a><br /><br /><a href="https://github.com/spring-projects/spring-data-rest" target="_blank">https://github.com/spring-projects/spring-data-rest</a><img src ="http://www.blogjava.net/paulwong/aggbug/415635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-07-09 17:36 <a href="http://www.blogjava.net/paulwong/archive/2014/07/09/415635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Data Dijkstra</title><link>http://www.blogjava.net/paulwong/archive/2014/07/01/415332.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 01 Jul 2014 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/07/01/415332.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/415332.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/07/01/415332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/415332.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/415332.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 15pt; padding: 0px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22.399999618530273px; background-color: #ffffff;">一大波Spring Data相关包：<br />Spring Data Dijkstra SR1 发布，该版本包含如下模块的 59 个问题修复：</p><ul list-paddingleft-2"="" style="margin: 0.5em 0px 0.5em 1.5em; padding: 0px; list-style-position: inside; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22.399999618530273px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px; display: inline;">Spring Data Commons 1.8.1 -&nbsp;<a href="http://repo.spring.io/libs-release/org/springframework/data/spring-data-commons/1.8.1.RELEASE" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Artifacts</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/commons/docs/1.8.1.RELEASE/api" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">JavaDocs</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/commons/docs/1.8.1.RELEASE/reference/htmlsingle" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Documentation</a>&nbsp;-<a href="http://docs.spring.io/spring-data/commons/docs/1.8.1.RELEASE/changelog.txt" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Changelog</a></p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px; display: inline;">Spring Data JPA 1.6.1 -&nbsp;<a href="http://repo.spring.io/libs-release/org/springframework/data/spring-data-jpa/1.6.1.RELEASE" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Artifacts</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/jpa/docs/1.6.1.RELEASE/api" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">JavaDocs</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/jpa/docs/1.6.1.RELEASE/reference/htmlsingle" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Documentation</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/jpa/docs/1.6.1.RELEASE/changelog.txt" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Changelog</a></p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px; display: inline;">Spring Data MongoDB 1.5.1 -&nbsp;<a href="http://repo.spring.io/libs-release/org/springframework/data/spring-data-mongodb/1.5.1.RELEASE" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Artifacts</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/mongodb/docs/1.5.1.RELEASE/api" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">JavaDocs</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/mongodb/docs/1.5.1.RELEASE/reference/htmlsingle" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Documentation</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/mongodb/docs/1.5.1.RELEASE/changelog.txt" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Changelog</a></p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px; display: inline;">Spring Data Neo4j 3.1.1 -&nbsp;<a href="http://repo.spring.io/libs-release/org/springframework/data/spring-data-neo4j/3.1.1.RELEASE" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Artifacts</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/neo4j/docs/3.1.1.RELEASE/api" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">JavaDocs</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/neo4j/docs/3.1.1.RELEASE/reference/htmlsingle" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Documentation</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/neo4j/docs/3.1.1.RELEASE/changelog.txt" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Changelog</a></p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px; display: inline;">Spring Data Solr 1.2.1 -&nbsp;<a href="http://repo.spring.io/libs-release/org/springframework/data/spring-data-solr/1.2.1.RELEASE" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Artifacts</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/solr/docs/1.2.1.RELEASE/api" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">JavaDocs</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/solr/docs/1.2.1.RELEASE/reference/htmlsingle" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Documentation</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/solr/docs/1.2.1.RELEASE/changelog.txt" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Changelog</a></p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px; display: inline;">Spring Data Couchbase 1.1.1 -&nbsp;<a href="http://repo.spring.io/libs-release/org/springframework/data/spring-data-couchbase/1.1.1.RELEASE" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Artifacts</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/couchbase/docs/1.1.1.RELEASE/api" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">JavaDocs</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/couchbase/docs/1.1.1.RELEASE/reference/htmlsingle" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Documentation</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/couchbase/docs/1.1.1.RELEASE/changelog.txt" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Changelog</a></p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px; display: inline;">Spring Data Cassandra 1.0.1 -&nbsp;<a href="http://repo.spring.io/libs-release/org/springframework/data/spring-data-cassandra/1.0.1.RELEASE" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Artifacts</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/cassandra/docs/1.0.1.RELEASE/api" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">JavaDocs</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/cassandra/docs/1.0.1.RELEASE/reference/htmlsingle" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Documentation</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/cassandra/docs/1.0.1.RELEASE/changelog.txt" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Changelog</a></p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px; display: inline;">Spring Data Elasticsearch 1.0.1 -&nbsp;<a href="http://repo.spring.io/libs-release/org/springframework/data/spring-data-elasticsearch/1.0.1.RELEASE" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Artifacts</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/elasticsearch/docs/1.0.1.RELEASE/api" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">JavaDocs</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/elasticsearch/docs/1.0.1.RELEASE/reference/htmlsingle" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Documentation</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/elasticsearch/docs/1.0.1.RELEASE/changelog.txt" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Changelog</a></p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px; display: inline;">Spring Data Gemfire 1.4.1 -&nbsp;<a href="http://repo.spring.io/libs-release/org/springframework/data/spring-data-gemfire/1.4.1.RELEASE" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Artifacts</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/gemfire/docs/1.4.1.RELEASE/api" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">JavaDocs</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/gemfire/docs/1.4.1.RELEASE/reference/htmlsingle" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Documentation</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/gemfire/docs/1.4.1.RELEASE/changelog.txt" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Changelog</a></p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px; display: inline;">Spring Data Redis 1.3.1 -&nbsp;<a href="http://repo.spring.io/libs-release/org/springframework/data/spring-data-redis/1.3.1.RELEASE" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Artifacts</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/redis/docs/1.3.1.RELEASE/api" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">JavaDocs</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/redis/docs/1.3.1.RELEASE/reference/htmlsingle" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Documentation</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/redis/docs/1.3.1.RELEASE/changelog.txt" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Changelog</a></p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px; display: inline;">Spring Data REST 2.1.1 -&nbsp;<a href="http://repo.spring.io/libs-release/org/springframework/data/spring-data-rest-webmvc/2.1.1.RELEASE" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Artifacts</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/rest/docs/2.1.1.RELEASE/api" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">JavaDocs</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/rest/docs/2.1.1.RELEASE/reference/htmlsingle" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Documentation</a>&nbsp;-&nbsp;<a href="http://docs.spring.io/spring-data/rest/docs/2.1.1.RELEASE/changelog.txt" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Changelog</a></p></li></ul><p style="margin: 0px 0px 15pt; padding: 0px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; line-height: 22.399999618530273px; background-color: #ffffff;">建议所有 Dijkstra 用户升级，因为包含重要的 bug 修复。</p><img src ="http://www.blogjava.net/paulwong/aggbug/415332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-07-01 10:49 <a href="http://www.blogjava.net/paulwong/archive/2014/07/01/415332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在EJB3的SESSION BEAN中使用SPRING BEAN</title><link>http://www.blogjava.net/paulwong/archive/2014/02/12/409777.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 12 Feb 2014 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/02/12/409777.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/409777.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/02/12/409777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/409777.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/409777.html</trackback:ping><description><![CDATA[EJB3 fa&#231;ade over Spring services<br /><a href="http://java.dzone.com/articles/ejb3-fa%C3%A7ade-over-spring" target="_blank">http://java.dzone.com/articles/ejb3-fa%C3%A7ade-over-spring</a><br /><br /><br />Using Spring&#8217;s EJB implementation support classes<br /><a href="http://docs.spring.io/spring/docs/current/spring-framework-reference/html/ejb.html#ejb-implementation-ejb3" target="_blank">http://docs.spring.io/spring/docs/current/spring-framework-reference/html/ejb.html#ejb-implementation-ejb3</a><br /><br /><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;javax.ejb.Stateless;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.interceptor.Interceptors;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;ch.frankel.blog.ejb.spring.service.client.RandomGeneratorService;<br /><br />@Stateless<br />@Interceptors(SpringBeanAutowiringInterceptor.<span style="color: #0000FF; ">class</span>)<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;RandomGeneratorBean&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;RandomGeneratorService&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;ch.frankel.blog.ejb.spring.service.RandomGeneratorService&nbsp;delegate;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;generateNumber(<span style="color: #0000FF; ">int</span>&nbsp;lowerLimit,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;upperLimit)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;delegate.generateNumber(lowerLimit,&nbsp;upperLimit);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><img src ="http://www.blogjava.net/paulwong/aggbug/409777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-02-12 16:43 <a href="http://www.blogjava.net/paulwong/archive/2014/02/12/409777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>