
【任何0基础都能看懂的步骤和解决方法!】
能力说明:
掌握封装、继承和多态设计Java类的方法,能够设计较复杂的Java类结构;能够使用泛型与集合的概念与方法,创建泛型类,使用ArrayList,TreeSet,TreeMap等对象掌握Java I/O原理从控制台读取和写入数据,能够使用BufferedReader,BufferedWriter文件创建输出、输入对象。
暂时未有相关云产品技术能力~
阿里云技能认证
详细说明今天提交idea上的代码到GitHub,提交过程已经完成, 在版本控制的Log中可以看到,已经将这一部分都提交更新了 在版本控制的Local Changes中已经看不到提交过的代码了 但是GitHub上并没有找到提交的代码 怎么办呢? 是因为刚刚走的过程中,其实还是没有走完,只是将Idea上的代码提交到了Git本地仓库,并没有将Git仓库中的代码提交到GitHub网站上 所以,还是需要将Git上的代码提交到GitHub上!! 这样即可解决这个问题啦
项目中使用实体之间存在一对多@OneToMany,多对一@ManyToOne的映射关系,怎么设置呢? GitHub地址:https://github.com/AngelSXD/myagenorderdiscount可以查看完整项目 下面给一个例子: 类似于一个部门对应多个员工 这里给出 一个流水账单对应多条订单折扣信息 流水账单类: package com.agen.orderdiscount.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.util.Date; import java.util.List; /** * 流水账单 * 请求提现以后,被记录在流水账单 * @author SXD * @date 2018/1/16 */ @Data(staticConstructor = "of") @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @Entity @GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator" ) public class RunningAccount { /** * 账单ID */ @Id @GeneratedValue(generator = "uuid2") @Column(length = 36) private String raId; /** * 流水账单编号 */ @Column(nullable = false,length = 100) private String raSn; /** * 流水金额 */ @Column(nullable = false,precision = 10,scale = 2) private Double raAccount; /** *流水账时间 */ @Column(nullable = false) private Date raDate; /** * 流水账单 状态 * 1 请求提现 * 2 通过提现请求,提现成功 * 3 拒绝提现请求,提现失败 * 4 通过部分提现请求中的订单,拒绝部分提现请求中的订单 * */ @Column(nullable = false) private Integer accountStatus; /** * 操作来源 */ @Column(nullable = false,length = 20) private String raOperater; /** * 流水备注1 */ @Column(length = 500) private String ratCre1; /** * 流水备注2 */ @Column(length = 500) private String ratCre2; /** * 关联子集流水账单 * 例如:本次提现 涉及到哪些订单,这些订单分别对应哪些可提现的流水 * * mappBy表示关系被维护端,只有关系端有权去更新外键。 * 这里还有注意OneToMany默认的加载方式是赖加载。当看到设置关系中最后一个单词是Many,那么该加载默认为懒加载 */ @OneToMany(cascade = {CascadeType.REFRESH,CascadeType.MERGE},mappedBy = "parentRa",fetch = FetchType.EAGER) private List<AvAmount> childAvamounts; } View Code 订单折扣信息类: package com.agen.orderdiscount.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.util.Date; /** * 可提现金额 * 报告完成,订单完结 从预估金额存入可提现金额 * @author SXD * @date 2018/1/16 */ @Data(staticConstructor = "of") @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @Entity @GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator" ) public class AvAmount { /** * 可提现ID */ @javax.persistence.Id @GeneratedValue(generator = "uuid2") @Column(length = 36) private String Id; /** * 本次转入可提现金额 */ @Column(nullable = false,precision = 10,scale = 2) private Double avAccount; /** * 本条可提现金额记录 状态 * 1 可提现 * 2 请求提现,正在等待处理 * 3 已经成功转账,提现成功 * 4 不满足提现条件,被拒绝提现请求的 * */ @Column(nullable = false) private Integer amountStatus; /** * 本次转入时间 */ @Column(nullable = false) private Date avDate; /** * 订单ID */ @Column(nullable = false) private Integer orderId; /** * 订单编号SN */ @Column(nullable = false,length = 20) private String orderSn; /** * 机构ID */ @Column(nullable = false) private Integer adminId; /** * 产品ID */ @Column(nullable = false) private Integer productId; /** * 会员ID */ @Column(nullable = false) private Integer memberId; /** * 采样包ID */ @Column(nullable = false) private Integer cybId; /** * 操作来源 */ @Column(nullable = false,length = 20) private String avOperater; /** * 可提现金额备注1 */ @Column(length = 500) private String avCre1; /** * 可提现金额备注2 */ @Column(length = 500) private String avCre2; /** * 关联流水账单记录 * * 这里设置JoinColum设置了外键的名字,Available是关系维护端 */ @ManyToOne(cascade = {CascadeType.MERGE,CascadeType.REFRESH}) @JoinColumn(name="parentRa") private RunningAccount parentRa; } View Code
先看看效果图:【当光标放在下面这个时间搜索框上时,显示一段文字:搜索时间段中的流水信息】 这样的效果,怎么实现呢? 很简单 1.引入jQuery.js和bootstrap的js和css 2.给想要有tip提示框效果的元素添加下面后面三个属性 <input type="text" class="form-control search-menu dateInput" data-toggle="tooltip" data-placement="top" title="搜索时间段中的流水信息"> data-toggle 标明这个元素有tips这个效果 data-placement 标明tips这个效果在本元素的什么位置显示 title 标明tips元素显示些什么文本内容 3.js中绑定一下tooltip即可 //时间搜索框--鼠标悬浮事件 $(".dateInput").tooltip();
小数点后保留两位小数 dicountPrice.toFixed(2)
1.jQuery选择直接子节点+除了某个元素 1》方法 $(".begon").children(".row:not(.moreDetail)") 2》选择器 $(".begon > .row:not(.moreDetail)") 2.
List转化为数组的两种方式: 第一种: List<String> list = new ArrayList<>(); String [] arr = list.toArray(new String[list.size()]); 第二种: List<String> list = new ArrayList<>(); String [] arr2 = list.stream().toArray(String[]::new);
实时监听Input textarea文本变化的监听事件:【但不包含通过js动态添加改变的文本事件】 HTML: <textarea style="display: none" class="notifyDetail"></textarea> js: /** * textarea值改变事件的监听 */ $(document).on("input propertychange",".notifyDetail",function(){ alert(123); }); 声明:【上面的监听 仅监听通过鼠标人为操作的改变text值的事件,如果是js动态去改变的值,这种事件并不能被监听到,这是js的限制!!!】
Bootstrap Notify说明文档:http://bootstrap-notify.remabledesigns.com/ Bootstrap Notify的GitHub地址:https://github.com/mouse0270/bootstrap-notify 自己使用步骤: 1.引入js【需要提前引入jQuery和bootstrap的js】 <script src="../static/js/admin/bootstrap-notify.min.js"></script> 2.引入动画css【需要提前引入bootstrap的css】 <link href="../static/css/login/animate.css" rel="stylesheet" /> 3.使用 //按钮点击事件 $(".seachA").click(function(){ var notify= notifyMsg("德玛西亚"); }); function notifyMsg(msg){ var notify = $.notify({ // options icon: 'glyphicon glyphicon-warning-sign', title: '警告', message: msg, target: '_blank' },{ // settings element: 'body', position: null, type: "warning", allow_dismiss: true, newest_on_top: true, showProgressbar: false, placement: { from: "bottom", align: "center" }, offset: 20, spacing: 10, z_index: 1031, delay: 5000, timer: 1000, url_target: '_blank' }); return notify; } 4.效果
jQuery下载的地址:http://www.htmleaf.com/jQuery/Form/201512182916.html GitHub地址:https://github.com/wangxing218/ui-choose 具体的使用步骤,大家自行百度就可以搜索到,原始的效果如下: 这个插件的主要思想,就是将页面上绑定的<select>中的<option>转变成了<ul>和<li>!!!!! ============================================================================================================ 这里咱们说明的是,对这个插件的样式按照自定义的需求进行修改的说明: 先看一下,最后的样子是这个样子的: 主要提现的效果就是可以让其整齐排列,一行2个,并且多余的文字自动省略号 要干的事情,第一就是为插件转化的ul和li设置bootstrap栅格系统 主要更改的就是下面这段:为ul添加了row 为li添加了 “col-lg-6 col-sm-6 col-md-6 col-xs-6” // 组建并获取相关的dom元素-select; _setHtml_select: function() { var _ohtml = '<ul class="ui-choose row">'; this.el.find('option').each(function(index, el) { var _this = $(el), _text = _this.text(), _value = _this.prop('value'), _selected = _this.prop('selected') ? 'selected' : '', _disabled = _this.prop('disabled') ? ' disabled' : ''; var colClass = "col-lg-6 col-sm-6 col-md-6 col-xs-6"; _ohtml += '<li title="' + _text + '" data-value="' + _value + '" class="' + _selected + _disabled +colClass+ '">' + _text + '</li> '; }); _ohtml += '</ul>'; this.el.after(_ohtml); this._wrap = this.el.next('ul.ui-choose'); this._items = this._wrap.children('li'); if (this._opt.itemWidth) { this._items.css('width', this._opt.itemWidth); } this.el.hide(); }, 而文字过多自动省略号的,可以参考:http://www.cnblogs.com/sxdcgaq8080/p/8184499.html 本篇文章的原始代码,可以查看GitHub项目:https://github.com/AngelSXD/myagenorderdiscount 大家可以去参考使用!!!
想要删除已经提交上GitHub上的文件, 删除之后,如果这个文件夹下没有文件了,这个文件夹也会被删除! 并且在它的上层文件夹后面 有提示删除了这个文件的信息!!
第一部分: 关于bootstrap中modal的使用,下面把几种自己用的打开方法展示出来 首先呢,得有个Bootstrap的页面,这里就不说了。 其次呢,得有个modal放在页面中,不管你这段代码加在页面代码的什么地方,默认是不会显示出来的 <div class="modal fade modalIndex" id="adminModal" role="dialog"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h4 class="modal-title" id="myModalLabel">机构筛选</h4> </div> <div class="modal-body"> 机构信息 </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button> <button type="button" class="btn btn-primary">确认</button> </div> </div> </div> </div> View Code 最后呢,就是下面的几种打开方式: 第一种打开方式: 在某个绑定的元素上添加下面两个属性【例如在button或者a标签上】 <a data-toggle="modal" data-target="#adminModal">机构</a> 只要target指向的id正确,就可以成功打开modal框。 第二种打开方式: 给某个绑定的元素添加class,【l例如在button或者a标签上】 <a class="adminA">机构</a> 然后写js为它添加点击事件: $(".adminA").click(function(){ $('#adminModal').modal("show"); }); 第二部分: 使用过程中出现的一些问题集锦 问题1:打开的Modal模态框位于页面上图层div的下面 解决方法: 为Modal指定z-index,即可解决 .modalIndex{ z-index: 999; } 然后为modal加上这个class即可。 ======================================================= 问题2: 怎么关闭modal? 解决方法: $('#adminModal').modal('hide'); =======================================================
js可以获取其元素的z-index值: $("document").ready(function(){ var a = $('.row').css('z-index'); alert(a); }); 对于值的解读: 值 描述 auto 默认。堆叠顺序与父元素相等。 number 设置元素的堆叠顺序。 inherit 规定应该从父元素继承 z-index 属性的值。
使用CSS可以设置一下样式: <style> u,small{ overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient:vertical; } </style> 对<u>标签和<small>标签都是用这个样式 <div class="row"> <div class="alert alert-info"> <div class="row"> <div class="col-lg-8 col-sm-12 col-md-12 col-xs-12 text-left"> <input type="hidden" name="adminId"/> <u name="adminName" style="text-overflow:ellipsis;">机构名称机构名称机构名称机构名称机构名称机构名称机构名称机构名称</u> </div> </div> <div class="row"> <div class="col-lg-6 col-sm-6 col-md-6 col-xs-6 text-left"> <input type="hidden" name="productId"/> <small name="productName">产品名称产品名称产品名称产品名称产品名称</small> </div> <div class="col-lg-6 col-sm-6 col-md-6 col-xs-6 text-right"> <small>¥<em>12.3</em>&nbsp;折扣价</small> </div> </div> </div> </div> 效果如下:
========================================================================================================================= 后文心得附录:【实际操作使用过程中的使用心得】 1.对于封装的jar中非提供给外界使用的方法,尽量将其设置为private 2.对于工具类中经常要使用的方法,可以设定为static,这样在使用过程中不用new一个对象再去引用,可以直接使用类名调用,方便高效!! 3. ========================================================================================================================= 有这么一个需求,想要将一个MD5加密的java文件功能类打包为Jar包,可以引入到项目中使用 1.先准备一个java文件 package com.sxd.util; import sun.misc.BASE64Encoder; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * 天使加密 */ public class AngelEncryption { /** * 主调 方法 * @param str * @return * @throws UnsupportedEncodingException * @throws NoSuchAlgorithmException */ public String angelKey(String str) throws UnsupportedEncodingException, NoSuchAlgorithmException { String newStr = encoderByMd5(str+"Angel's Key"); return newStr; } /**利用MD5进行加密 * @param str 待加密的字符串 * @return 加密后的字符串 * @throws NoSuchAlgorithmException 没有这种产生消息摘要的算法 * @throws UnsupportedEncodingException */ public String encoderByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException { //确定计算方法 MessageDigest md5= MessageDigest.getInstance("MD5"); BASE64Encoder base64en = new BASE64Encoder(); //加密后的字符串 String newstr=base64en.encode(md5.digest(str.getBytes("utf-8"))); return newstr; } } View Code 2.将java文件编译为class文件 1》【将java文件按照package的路径位置,放在对应的目录下】 2》将java文件编译为class文件【要求已经安装了JDK并且配置了环境变量】 【因为文件格式为UTF-8,所以采用下面注明编码方式编译】 3》编译完成之后的目录下 3.接下来就可以使用jar -cvf进行打包了 1》回退到com.sxd.util的最外层 因为在java代码中,最上面的package是如下,所以需要对com层进行打包 2》进入cmd运行打包 3》查看打包出来的jar包以及层级结构 4.现在打包jar包成功了,怎么使用到项目中呢? 1》如果不想将本jar包交给maven管理,那就直接放在项目的lib中,然后build添加进项目的jar包依赖下 2》如果想交给maven管理,可以将jar包上传到maven私服上,然后在pom.xml文件中引用【具体参考:http://www.cnblogs.com/sxdcgaq8080/p/7583767.html】 【下面的流程是在你已经搭建了maven私服的情况下再看】 流程如下: 1>cmd指定命令如下 mvn deploy:deploy-file -DgroupId=sxd.jar -DartifactId=AngelKey -Dversion=1.1 -Dpackaging=jar -Dfile=G:\test\AngelKey-1.1.jar -Durl=http://localhost:8081/repository/myself_hosted/ -DrepositoryId=myself_hosted 解释说明如下: 2>执行上面的命令后效果如下 3>查看本地仓库中的jar包是否上传成功 4>上面看不到jar包,那在私服中搜索一下【按照Artfact Id查找】 5>好了,现在在pom.xml文件中引用,在项目中使用该jar包 pom.xml文件引入 <!--AngelKey加密--> <dependency> <groupId>sxd.jar</groupId> <artifactId>AngelKey</artifactId> <version>1.1</version> </dependency> Test.java中使用 package com.agen.util.utils; import com.sxd.util.AngelEncryption; import org.junit.jupiter.api.Test; import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; public class AngelKeyTest { @Test public void test() throws UnsupportedEncodingException, NoSuchAlgorithmException { AngelEncryption angelEncryption = new AngelEncryption(); String password = "admin123"; String newStr = angelEncryption.angelKey(password); System.out.println(newStr); } } 可以看到本类的引用路径为 import com.sxd.util.AngelEncryption; 运行结果: OK完成了!!!!
后台程序放入Model中,从前台el表达式取出来非常方便,但是如果需要处理 当数据为null的时候,怎么办,不为null的时候,怎么办;这个怎么处理呢? <span class="user-name adminName"> <c:if test="${empty admin.name}"> 机构获取失败 </c:if> <c:if test="${not empty admin.name}"> ${admin.accessman} </c:if> </span> <span class="user-name adminAddress"> 中间人: <c:if test="${empty admin.accessman}"> 暂无 </c:if> <c:if test="${not empty admin.accessman}"> ${admin.accessman} </c:if> </span> 效果如下: 或者:
spring boot整合redis:http://www.cnblogs.com/sxdcgaq8080/p/8028970.html 首先,明确一下问题的场景 之前在spring boot整合redis,关于redis的使用都是在repository层上再封装一层service层,在service层上使用的。 现在如果直接将redis的注解放在repository上使用,是个什么情况呢? 代码如下: 1.首先我有一个实体XxAdmin,主键为id 2.Xxadmin我写了一个AdminRepository package com.agen.myagen.repository; import com.agen.myagen.entity.XxAdmin; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.jpa.repository.JpaRepository; /** * admin持久化层 * * @author SXD * @date 2017/12/26 */ public interface AdminRepository extends JpaRepository<XxAdmin,Integer> { /** * 查找机构信息 * 并缓存到redis,键为id 值为XxAdmin * @param adminId * @return */ @Cacheable(value="admins", key="#adminId") @Override XxAdmin findOne(Integer adminId); } View Code 3.我在controller直接调用 package com.agen.controller; import com.agen.myagen.entity.XxAdmin; import com.agen.myagen.repository.AdminRepository; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.annotation.Resource; @Controller public class MainController { @Resource private AdminRepository adminRepository; @RequestMapping("index") public String getOrder(String adminId){ Integer adminID = Integer.parseInt(adminId); XxAdmin admin = adminRepository.findOne(adminID); return null; } } View Code 【报错】 启动之后,报错如下:Null key returned for cache operation (maybe you are using named params on classes without debug info?) java.lang.IllegalArgumentException: Null key returned for cache operation (maybe you are using named params on classes without debug info?) Builder[public abstract com.agen.myagen.entity.XxAdmin com.agen.myagen.repository.AdminRepository.findOne(java.lang.Integer)] caches=[admins] | key='#adminId' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false' 报这个错,原因就是redis认定这个key是Null的,没办法存入,所以报错了。 但是之前咱们上一篇就是这么用的呀,查看上一篇,可以发现,redis是使用在service层,是在repository的再封装层使用的,那redis就不能直接使用在repository层了么? 【这里因为项目原因,不赘述为什么不封装一层service层使用,而是直接在repository层使用】【最后具体为什么key在这里会认定为null也没有找到原因,若知情,恳请告知!!!谢谢了】 【解决方法】 翻来覆去之后,发现redis的@Cacheable注解放在repository方法上,key会被认定为null,导致存不进redis缓存。 所以,换一种思路来解决这个问题,就是提前设定一种key的生成策略,即在RedisConfig类中指定一种KeyGenerator。【这一步骤的解释,可以查看http://www.cnblogs.com/sxdcgaq8080/p/8028970.html】 具体的解决方法如下: 在RedisConfig中,设定仅取第一个参数作为key的key生成策略 /** * 生成key的策略【自定义第三种】 * 使用范围:仅适用于选取第一个参数做键的情况 * 由于reposotory上不能直接使用spel表达式作key,故而采用key的生成策略的方式来替换 * * 使用时在注解@Cacheable(value = "admins",keyGenerator = "firstParamKeyGenerator")中指定 * @return */ @Bean(name = "firstParamKeyGenerator") public KeyGenerator firstParamKeyGenerator(){ return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(params[0].toString()); return sb.toString(); } }; } View Code 然后在AdminRepository中更换@Cacheable中的属性 public interface AdminRepository extends JpaRepository<XxAdmin,Integer> { /** * 查找机构信息 * 并缓存到redis,键为id 值为XxAdmin * @param adminId * @return */ @Cacheable(value="admins", keyGenerator = "firstParamKeyGenerator") @Override XxAdmin findOne(Integer adminId); } View Code 然后再去访问一次, 控制台成功从数据库查询了Xxadmin对象 查看redis中,已经将本对象存入缓存 再次访问,发现并未执行SQL语句,直接从缓存中取出本对象。 OK,直接在spring boot的repository层使用redis注解成功。 ============================================================================================================================================== 最后,可以将AdminRepository类上使用 @CacheConfig(cacheNames = "admins") 指定本类中所有的方法,操作的缓存都是名为admins的缓存!! package com.agen.myagen.repository; import com.agen.myagen.entity.XxAdmin; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.jpa.repository.JpaRepository; /** * admin持久化层 * * @author SXD * @date 2017/12/26 */ @CacheConfig(cacheNames = "admins") public interface AdminRepository extends JpaRepository<XxAdmin,Integer> { /** * 查找机构信息 * 并缓存到redis,键为id 值为XxAdmin * @param adminId * @return */ @Cacheable(keyGenerator = "firstParamKeyGenerator") @Override XxAdmin findOne(Integer adminId); } View Code 具体可以参考:http://www.cnblogs.com/sxdcgaq8080/p/7228163.html查看这几个注解的使用场景 ============================================================================================================================================== 本系列的源代码,可以从GitHub上获取查看:https://github.com/AngelSXD/myagenorderdiscount,类名及方法名都是对应的。所以想查看这部分使用的,可以直接在项目中查看即可!!
今天在处理异常日志保存过程中,想要获取到异常抛出在具体在那个文件,哪个类下的哪个方法中的具体第几行,所以具体实现如下 try{ Integer adminID = Integer.parseInt(adminId); XxAdmin admin = adminRepository.findOne(adminID); model.addAttribute("admin",admin); }catch (Exception e){ StackTraceElement stackTraceElement = e.getStackTrace()[0]; String errorMsg = "文件名:"+stackTraceElement.getFileName()+ "\r\n类名:"+stackTraceElement.getClassName()+ "\r\n方法名:"+stackTraceElement.getMethodName()+ "\r\n抛出异常行号:"+stackTraceElement.getLineNumber()+ "\r\n机构ID异常,无法获取本机构信息:"+e; System.out.println(errorMsg); logger.error(errorMsg); } 对于堆栈【先进后出】的数组下标,可以根据自己的需求,看是需要打印出最上层的异常行号还是外层调用它的方法的异常行号!!!
其中的架包和代码,具体可以去GitHub下查看: https://github.com/AngelSXD/myagenorderdiscount 1.引入js和css <link href="static/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="static/css/index/daterangepicker.css" /> <link rel="stylesheet" href="static/css/index/custom.css"> <script src="static/bootstrap/js/jquery-1.11.0.min.js" type="text/javascript"></script> <script src="static/bootstrap/js/bootstrap.min.js"></script> <script src="static/js/index/custom.js"></script> <script src="static/js/index/daterangepicker.js"></script> 2.页面上有一个input框 <input type="text" class="form-control search-menu dateInput"> 3.js中赋予这个input时间插件即可 //时间搜索框--赋予时间插件 $(".dateInput").daterangepicker({ "showDropdowns": true, "showWeekNumbers": true, "showISOWeekNumbers": true, "autoApply": true }, function(start, end, label) { console.log("选定时间段: ' + start.format('YYYY-MM-DD') + ' to ' + end.format('YYYY-MM-DD') + ' (predefined range: ' + label + ')"); }); 效果如下:
有时候切换发现某块div一直悬浮在最上层,怎么设置div位于浏览器的最底层。离用户最远? <style> .in{ z-index: -1; } </style> 然后引用in到你想用的div的class上即可!z-index代表图层的优先级,正数越大,离用户越近!负数则最远!
即如下: 【想做到点击nav侧边栏,仅替换右边div中的内容,而不是跳转到新的页面,这样的话,其实整个项目中就只有一个完整的页面,其他的页面均只写<body>内的部分即可,或者仅仅写要替换的<div>内的部分即可!!】 index.jsp页面就是如上,也就是整个项目中的主页面,页面中包含nav部分和div部分,现在index.js中绑定左边侧边栏点击事件 $(".sub").click(function(){ //点击侧边栏的一个按钮之后,ajax去请求后台controller,然后controller返回一个页面地址,data中即新页面中的标签代码,然后填充到div中即可实现整个项目单页面 $.ajax({url:"../sub1", type:"post", traditional:true, success:function(data){ $(".container-fluid").empty(); $(".container-fluid").append(data); } }); }); controller.java如下: @RequestMapping(value = "sub1") public String sub1(){ System.out.println("zhuyemian"); return "/sub/sub1"; } 中代码如下: 然后点击之后跳转的效果如下: 乱码处理方式: sub1.jsp中代码修改为: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%> <h1 class=""> 做点什么事情</h1> 重新跳转访问: 即可解决乱码问题!!!
即如下: 【想做到点击nav侧边栏,仅替换右边div中的内容,而不是跳转到新的页面,这样的话,其实整个项目中就只有一个完整的页面,其他的页面均只写<body>内的部分即可,或者仅仅写要替换的<div>内的部分即可!!】 index.jsp页面就是如上,也就是整个项目中的主页面,页面中包含nav部分和div部分,现在index.js中绑定左边侧边栏点击事件 $(".sub").click(function(){ //点击侧边栏的一个按钮之后,ajax去请求后台controller,然后controller返回一个页面地址,data中即新页面中的标签代码,然后填充到div中即可实现整个项目单页面 $.ajax({url:"../sub1", type:"post", traditional:true, success:function(data){ $(".container-fluid").empty(); $(".container-fluid").append(data); } }); }); controller.java如下: @RequestMapping(value = "sub1") public String sub1(){ System.out.println("zhuyemian"); return "/sub/sub1"; } 中代码如下: 然后点击之后跳转的效果如下: 乱码处理方式: sub1.jsp中代码修改为: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%> <h1 class=""> 做点什么事情</h1> 重新跳转访问: 即可解决乱码问题!!! ========================================================================================================== 问题1: 母页面中<script>引入js都在页面的最下方,而新引入的页面,也会需要引入新的js文件,那这引入的js文件能否起作用呢? 说明如下: 解释: 可以直接追加进入!!且自定义的js是可以起作用的。因为在新页面的代码追加入母页面的div之前,母页面中的js文件都已经加载成功了!
使用场景: 方法处理到某一步,需要将信息交给另一个线程去处理!! =================================================================================== 第一种:最简单的Runnable public void test(String msg){ System.out.println(Thread.currentThread().getName()+":"+msg); Runnable runnable = dealMsg(msg); //将返回的runnable对象传入,并start()启动线程 new Thread(runnable).start(); } //创建一个Runnable,重写run方法public Runnable dealMsg(String msg){ Runnable runnable = new Runnable() { @Override public void run() { System.out.println("新开线程中处理:"+msg); } }; return runnable; } ==================================================================================================== 第二种:自己创建JDK线程池,交给spring管理,然后将任务交给线程池即可 1.创建线程池,交给spring管理 package com.sxd.util; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @Configuration public class ThreadConfig { /** *newFixedThreadPool 创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。 newCachedThreadPool 创建一个可缓存的线程池。这种类型的线程池特点是: 1).工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。 2).如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。 newSingleThreadExecutor 创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一个取代它,保证顺序执行(我觉得这点是它的特色)。单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的 。 newScheduleThreadPool 创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer。 * @return */ @Bean public ExecutorService getExecutorTools(){ ExecutorService executorService = Executors.newFixedThreadPool(8); return executorService; } } View Code 2.使用它 import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; @Component public class Consumer1 { @Resource private ExecutorService executorService; public void test(String msg){ System.out.println(Thread.currentThread().getName()+":"+msg); /** * 分类1:可以返回值的 Callable */ Future fal = executorService.submit(new Callable<String>() { @Override public String call() { System.out.println(Thread.currentThread().getName()+":"+msg); return "处理成功!"; } }); try { System.out.println(fal.get()); }catch (Exception e){ System.out.println(e); } /** * 分类2:不会返回值的 Runnable */ executorService.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+":"+msg); } }); /** * 分类3:也可以这样 */ executorService.submit(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+":"+msg); } }); } } View Code ==================================================================================================== 第三种:使用spring封装的线程池 1.创建线程配置类【 @ComponentScan("com.sxd") 标明会在哪个包下使用多线程 】 package com.sxd.util; import java.util.concurrent.Executor; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configuration @ComponentScan("com.sxd") @EnableAsync // 线程配置类 public class AsyncTaskConfig implements AsyncConfigurer { // ThredPoolTaskExcutor的处理流程 // 当池子大小小于corePoolSize,就新建线程,并处理请求 // 当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去workQueue中取任务并处理 // 当workQueue放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理 // 当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁 @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(5);// 最小线程数 taskExecutor.setMaxPoolSize(10);// 最大线程数 taskExecutor.setQueueCapacity(25);// 等待队列 taskExecutor.initialize(); return taskExecutor; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; } } View Code 2.创建线程任务执行类 package com.sxd.util; import java.util.Random; import java.util.concurrent.Future; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service; @Service // 线程执行任务类 public class AsyncTaskService { Random random = new Random();// 默认构造方法 @Async // 表明是异步方法 // 无返回值 public void executeAsyncTask(String msg) { System.out.println(Thread.currentThread().getName()+"开启新线程执行" + msg); } /** * 异常调用返回Future * * @param i * @return * @throws InterruptedException */ @Async public Future<String> asyncInvokeReturnFuture(int i) throws InterruptedException { System.out.println("input is " + i); Thread.sleep(1000 * random.nextInt(i)); Future<String> future = new AsyncResult<String>("success:" + i);// Future接收返回值,这里是String类型,可以指明其他类型 return future; } } View Code 3.使用它 @Component public class Consumer1 { @Resource private AsyncTaskService asyncTaskService; public void test(String msg){ System.out.println(Thread.currentThread().getName()+":"+msg); asyncTaskService.executeAsyncTask(msg); } } View Code ====================================== 就这么多,再补充噻!!
在spring boot下使用ActiveMQ,需要一下几个条件 1.安装并启动了ActiveMQ,参考:http://www.cnblogs.com/sxdcgaq8080/p/7919489.html 2.搭建了spring boot项目,参考:http://www.cnblogs.com/sxdcgaq8080/p/7712874.html ====================================================================================================================== 好了下面正式开始吧: 1.pom.xml文件添加maven依赖 <!--ActiveMQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> 2.application.properties配置文件配置 #activeMQ #61616为消息代理接口 ,8161 为管理界面 spring.activemq.broker-url=tcp://localhost:61616 spring.activemq.user=admin spring.activemq.password=admin spring.activemq.in-memory=true spring.activemq.pool.enabled=false 3.消息生产者Producer.java package com.sxd.jms; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Service; import javax.jms.Destination; @Service("producer1") public class Producer1 { @Autowired // 也可以注入JmsTemplate,JmsMessagingTemplate对JmsTemplate进行了封装 private JmsMessagingTemplate jmsTemplate; // 发送消息,destination是发送到的队列,message是待发送的消息 public void sendMessage(Destination destination, final String message){ jmsTemplate.convertAndSend(destination, message); } } View Code 4.消息消费者Consumer.java package com.sxd.jms; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.messaging.support.GenericMessage; import org.springframework.stereotype.Component; import javax.jms.JMSException; import javax.jms.TextMessage; @Component(value = "consumer1") public class Consumer1 { @Autowired // 也可以注入JmsTemplate,JmsMessagingTemplate对JmsTemplate进行了封装 private JmsMessagingTemplate jmsTemplate; public String receive(String queueName){ GenericMessage textMessage = (GenericMessage)jmsTemplate.receive(queueName); try { System.out.println("消费者1收到消息为:"+textMessage.toString()); return textMessage.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } } View Code 5.控制层调用Controller【localhost:8080/log消息生产】【localhost:8080/log2消息消费】 package com.sxd.controller; import com.sxd.jms.Consumer1; import com.sxd.jms.Producer1; import org.apache.activemq.command.ActiveMQQueue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import javax.jms.Destination; @Controller public class MainController { @Resource(name = "producer1") private Producer1 producer1; @Resource(name = "consumer1") private Consumer1 consumer1; @RequestMapping("/toLogin") public String hello(){ return "login"; } Logger logger = LoggerFactory.getLogger(this.getClass()); @RequestMapping("/log") @ResponseBody public void logTest(){ Destination destination = new ActiveMQQueue("jms.queue"); producer1.sendMessage(destination,"您有一条新消息,请注意查收!"); } @RequestMapping("/log2") @ResponseBody public void log2Test(){ String queueName = "jms.queue"; consumer1.receive(queueName); } } View Code ============================================================================================================================= 上面已经可以使用了,但是消息队列中对于消息的消费,如果能实现自动监听,自动处理那就更好了,给【消息消费者Consumer】修改一下 Consumer.java package com.sxd.jms; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @Component public class Consumer1 { @JmsListener(destination = "jms.queue") public void receive(String msg){ System.out.println(msg); } } View Code 消息生产者依旧 不变,然后Controller.java往队列中存放消息即可。 @RequestMapping("/log") @ResponseBody public void logTest(){ Destination destination = new ActiveMQQueue("jms.queue"); producer1.sendMessage(destination,"您有一条新消息,请注意查收!"); } View Code ============================================================================================================================ 最后,如果想要实现双向消息传输呢? 什么意思呢,就是【消息消费者Consumer】处理完消息之后,可以带回给【消息生产者Producer 】一些有用的信息. 这样的话,Consumer.java就该这么写: 这样在监听到jms.queue消息队列中的消息之后,处理完成,将返回的消息放入reback.queue消息队列中 package com.sxd.jms; import org.springframework.jms.annotation.JmsListener; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.stereotype.Component; @Component public class Consumer1 { @JmsListener(destination = "jms.queue") @SendTo("reback.queue") public String receive(String msg){ System.out.println(msg); return "已经接收到消息,且处理完成!!"; } } View Code 而Producer.java应该再多加一个监听,监听返回消息队列中的消息: package com.sxd.jms; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.annotation.JmsListener; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Service; import javax.jms.Destination; @Service("producer1") public class Producer1 { @Autowired // 也可以注入JmsTemplate,JmsMessagingTemplate对JmsTemplate进行了封装 private JmsMessagingTemplate jmsTemplate; // 发送消息,destination是发送到的队列,message是待发送的消息 public void sendMessage(Destination destination, final String message){ jmsTemplate.convertAndSend(destination, message); } @JmsListener(destination = "reback.queue") public void receiveConsumer(String msg){ System.out.println(msg); } } View Code 最后Controller.java中访问测试一下: @RequestMapping("/log") @ResponseBody public void logTest(){ Destination destination = new ActiveMQQueue("jms.queue"); producer1.sendMessage(destination,"您有一条新消息,请注意查收!"); } View Code ==================================================================================== 结束!!!
需要的工具: 1.InteillJ IDEA 2.Git 3.GitHub帐号 步骤: 1.下载Git 下载地址:https://git-scm.com/downloads 安装完成后 勾选Launch Git,弹出来下面窗口代表安装Git成功 最后在这个窗口中键入: git config --global user.name "你自己的名字" git config --global user.email "你自己的邮箱地址" 注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置!!! 2.GitHub帐号注册 参考:http://www.cnblogs.com/sxdcgaq8080/p/7125255.html 3.下来就在Idea上折腾了 1》将Git启动程序加入Idea File-->setting-->Vsersion Control-->Git--->Path to Git executable-->选中安装的git.exe之后,点击Test-->弹出下面的successfully窗口即可! 2》设置连接GitHub File-->Setting-->Version Control-->GitHub-->选择验证方式使用password验证--->输入用户名密码-->Test-->弹出successfully窗口即可 3》创建本地Git仓库 VCS -->Import into Version Control -->Create Git Repository 然后选中项目所在位置: Ok之后,项目全部变红 然后选择把项目新添到Git Git-->add add之后变成绿色 然后提交项目到Git Git--->commit Directory 填写 作者名,填写message 完全提交了之后,整个项目文件都变成白色的了 4.提交项目到GitHub VCS--->Import into Version Control -->share Project on GitHub 像上面这样,根本提交不上去,报错如下: 所以,只好修改为如下: 第一次提交弹出来输入GitHub用户名密码的相关信息,但是也没有输入,也成功提交上去了!! 你现在就可以点击链接查看新上传到GitHub上的代码了! 5.提交修改的文件到GitHub上 然后右键项目 Git--->commit Directory--->Commit and push 不止要提交 还要推送到GitHub上。 push 成功之后,就可以在GitHub上看到了 如果提交不成功的话,会提示相关的冲突错误等等,根据问题进行排查即可!!! ========================================================================== 完结了!!!
未完成
1、安装zip、unzip应用 yum install zip unzip 2、压缩和解压文件 以下命令均在/home目录下操作 cd /home #进入/home目录 a、把/home目录下面的mydata目录压缩为mydata.zip zip -r mydata.zip mydata #压缩mydata目录 b、把/home目录下面的mydata.zip解压到mydatabak目录里面 unzip mydata.zip -d mydatabak c、把/home目录下面的abc文件夹和123.txt压缩成为abc123.zip zip -r abc123.zip abc 123.txt d、把/home目录下面的wwwroot.zip直接解压到/home目录里面 unzip wwwroot.zip e、把/home目录下面的abc12.zip、abc23.zip、abc34.zip同时解压到/home目录里面 unzip abc\*.zip f、查看把/home目录下面的wwwroot.zip里面的内容 unzip -v wwwroot.zip g、验证/home目录下面的wwwroot.zip是否完整 unzip -t wwwroot.zip h、把/home目录下面wwwroot.zip里面的所有文件解压到第一级目录 unzip -j wwwroot.zip
进入root用户,然后编辑 vi /usr/libexec/urlgrabber-ext-down 将首行换成 #!/usr/bin/python2.6
如果你在编译时遇到这个错误,这可能是下面的原因:你尝试编译的程序使用OpenSSL,但是需要和OpenSSL链接的文件(库和头文件)在你Linux平台上缺少。 所以在CentOS下, 退到根路径,【需要在root用户下】然后输入: yum install openssl-devel 安装完成后,重新编译自己的程序即可。
参考地址:https://spring.io/guides/gs/messaging-redis/ ============================================================================================================================== 1.pom.xml关于redis的依赖 spring boot 1.4版本之前的关于redis的依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency> 上面依赖如果在高版本使用,会出现下面的情况: 已经被弃用 而spring boot 1.4版本之后的关于redis的依赖 【如下,使用时去掉<version>即可】 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>1.5.8.RELEASE</version> </dependency> 2.application.properties配置 #redis # Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redis.host=localhost # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码(默认为空) spring.redis.password=398023 # 连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active=8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait=-1 # 连接池中的最大空闲连接 spring.redis.pool.max-idle=8 # 连接池中的最小空闲连接 spring.redis.pool.min-idle=0 # 连接超时时间(毫秒) spring.redis.timeout=0 3.RedisConfig.java 【Redis的key生成策略、缓存管理、序列化】 【配置以后,就可以单独使用注解的方式使用redis了】 package com.sxd.redis; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { /** * 生成key的策略【默认第一种】 * 如果不指定,则按照本方法的key生成策略去拼接key * 例如:com.sxd.service.UserServiceImpl.save:com.sxd.entity.User@7c9359ec * @return */ @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()+"."); sb.append(method.getName()); for (Object obj : params) { sb.append(":"+obj.toString()); } return sb.toString(); } }; } /** * 生成key的策略【自定义第二种】 * 使用时在注解@Cacheable(value = "12s",keyGenerator = "listkeyGenerator")中指定 * @return */ @Bean(name = "listkeyGenerator") public KeyGenerator listkeyGenerator(){ return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(method.getName()); return sb.toString(); } }; } /** * 缓存管理 */ @Bean public CacheManager cacheManager(RedisTemplate redisTemplate) { RedisCacheManager rcm =new RedisCacheManager(redisTemplate); //按需求设置自己需要的 缓存名字 和 对应的失效时间 //可以不要 Map<String,Long> map = new HashMap<>(); map.put("12h",3600*12L); map.put("12m",60*12L); map.put("12s",12L); rcm.setExpires(map); return rcm; } /** * RedisTemplate配置 * Redis序列化 */ @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } } View Code 4.RedisService.java 【spring提供操作redis方法的封装】 【本来注解可以单独使用操作redis,如果配合封装的方法的话,可以实现更多更完善的功能】 package com.sxd.redis; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.*; import org.springframework.stereotype.Service; import java.io.Serializable; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; @Service public class RedisService { @Autowired private RedisTemplate redisTemplate; /** * 写入缓存 * @param key * @param value * @return */ public boolean set(final String key, Object value) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 写入缓存设置失效时间 * @param key * @param value * @return */ public boolean set(final String key, Object value, Long expireTime) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 批量删除对应的value * @param keys */ public void remove(final String... keys) { for (String key : keys) { remove(key); } } /** * 批量删除key * @param pattern */ public void removePattern(final String pattern) { Set<Serializable> keys = redisTemplate.keys(pattern); if (keys.size() > 0) redisTemplate.delete(keys); } /** * 根据key删除对应的value * @param key */ public void remove(final String key) { if (exists(key)) { redisTemplate.delete(key); } } /** * 根据key判断缓存中是否有对应的value * @param key * @return */ public boolean exists(final String key) { return redisTemplate.hasKey(key); } /** * 根据key读取缓存 * @param key * @return */ public Object get(final String key) { Object result = null; ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); result = operations.get(key); return result; } /** * 哈希 添加 * @param key * @param hashKey * @param value */ public void hmSet(String key, Object hashKey, Object value){ HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); hash.put(key,hashKey,value); } /** * 哈希获取数据 * @param key * @param hashKey * @return */ public Object hmGet(String key, Object hashKey){ HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); return hash.get(key,hashKey); } /** * 列表添加 * @param k * @param v */ public void lPush(String k,Object v){ ListOperations<String, Object> list = redisTemplate.opsForList(); list.rightPush(k,v); } /** * 列表获取 * @param k * @param l * @param l1 * @return */ public List<Object> lRange(String k, long l, long l1){ ListOperations<String, Object> list = redisTemplate.opsForList(); return list.range(k,l,l1); } /** * 集合添加 * @param key * @param value */ public void add(String key,Object value){ SetOperations<String, Object> set = redisTemplate.opsForSet(); set.add(key,value); } /** * 集合获取 * @param key * @return */ public Set<Object> setMembers(String key){ SetOperations<String, Object> set = redisTemplate.opsForSet(); return set.members(key); } /** * 有序集合添加 * @param key * @param value * @param scoure */ public void zAdd(String key,Object value,double scoure){ ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); zset.add(key,value,scoure); } /** * 有序集合获取 * @param key * @param scoure * @param scoure1 * @return */ public Set<Object> rangeByScore(String key,double scoure,double scoure1){ ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); return zset.rangeByScore(key, scoure, scoure1); } } View Code 5.创建实体,对应数据库中的数据表,实体对应的Repository,和实体对应的ServiceImpl,以及Controller 实体类就不上了 repository如下: 【只写了几个方法】 package com.sxd.repository; import com.sxd.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.lang.annotation.Target; public interface UserRepository extends JpaRepository<User,String>{ User findByUsername(String username); User findByUsernameAndPassword(String username,String password); User findById(String id); @Query("select u from User u where u.username = :name") User findUser(@Param("name")String username); User findTop3ByAge(Integer age); } View Code UserServiceImpl.java package com.sxd.service; import com.sxd.entity.User; import com.sxd.redis.RedisService; import com.sxd.repository.UserRepository; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; import java.util.Objects; import java.util.UUID; import static javafx.scene.input.KeyCode.T; @Service public class UserServiceImpl { @Resource private UserRepository userRepository; @Resource private RedisService redisService; @Cacheable(value = "us",key = "'EDS'") // @Cacheable(value = "12h",keyGenerator = "listkeyGenerator") // RedisConfig.java中配置的 定时失效的缓存,可以在这里指定value就是那边设定的缓存名 // keyGenerator 可以指定RedisConfig.java中配置的key生成策略 // key的值可以设定为字符串【字符串必须要用''引起来,否则会将其认定为字段而报错】 例如:key = "'EDS'" // key的值也可以设定为spEL表达式书写 例如:key = "#userId" // key的值也可以设定为 例如:key = "T(java.util.UUID).randomUUID().toString()" // 关于注解中每个属性的详细使用,可以详细去查看API public List<User> findAllUser(){ List<User> list = userRepository.findAll(); return Objects.nonNull(list) ? list : null; } @Cacheable(value = "allUser",key = "#userId") public User getById(String userId){ User user = userRepository.findById(userId); return Objects.nonNull(user) ? user : null; } @CachePut(value = "allUser",key="#user.id") public User save(User user){ user = userRepository.save(user); redisService.remove("findAllUser"); return user; } @CacheEvict(value = "allUser",allEntries = true) public void flushRedis(){ } } View Code 关于这三个注解的详细使用说明:http://www.cnblogs.com/sxdcgaq8080/p/7228163.html 最后Controller去访问就好了 。 6.最后的说明 第一:@Cacheable(value = "12h",keyGenerator = "listkeyGenerator") 第二:RedisConfig.java中配置的 定时失效的缓存,可以在这里指定value就是那边设定的缓存名 第三:keyGenerator 可以指定RedisConfig.java中配置的key生成策略 第四:key的值可以设定为字符串【字符串必须要用''引起来,否则会将其认定为字段而报错】 例如:key = "'EDS'" 第五:key的值也可以设定为spEL表达式书写 例如:key = "#userId" 第六:key的值也可以设定为 例如:key = "T(java.util.UUID).randomUUID().toString()"第七:spring管理redis的情况下,实测,就算@Cacheable(value = "",key="")中的value值不同,key如果一致,也就是如果键值对的key已经存在与redis中,就算value值不同,也不会去创建新的缓存第八:单独使用注解去使用了管理redis的话,很大程度上不是很灵活和方便,所以推荐使用注解和RedisService.java中的封装方法一起使用,效果更佳!第九:RedisService.java中封装的方法仅作为部分参考,各位可以自己去完善更丰富的操作方法!! 第十:关于注解中每个属性的详细使用,可以详细去查看API 下面展示一下redis中存入的数据!! ========================================================================= 大概就是这些了。 赶紧完善正式项目中的这部分功能了!!!!
spring版本:4.3.13 ActiveMq版本:5.15 ======================================================== spring整合activeMQ,pom.xml文件缺架包,启动报错: [springDemo][INFO] [2017-12-11 14:54:57] org.springframework.web.context.ContextLoader.initWebApplicationContext(304) | Root WebApplicationContext: initialization started [springDemo][INFO] [2017-12-11 14:54:57] org.springframework.context.support.AbstractApplicationContext.prepareRefresh(583) | Refreshing Root WebApplicationContext: startup date [Mon Dec 11 14:54:57 CST 2017]; root of context hierarchy [springDemo][INFO] [2017-12-11 14:54:57] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(317) | Loading XML bean definitions from class path resource [spring-hibernate.xml] [springDemo][INFO] [2017-12-11 14:54:58] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(317) | Loading XML bean definitions from class path resource [spring-ActiveMQ.xml] [springDemo][ERROR] [2017-12-11 14:55:00] org.springframework.web.context.ContextLoader.initWebApplicationContext(350) | Context initialization failed org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [spring-ActiveMQ.xml]; nested exception is org.springframework.beans.FatalBeanException: NamespaceHandler class [org.apache.xbean.spring.context.v2.XBeanNamespaceHandler] for namespace [http://activemq.apache.org/schema/core] not found; nested exception is java.lang.ClassNotFoundException: org.apache.xbean.spring.context.v2.XBeanNamespaceHandler at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:414) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125) at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:614) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:515) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4727) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5189) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1702) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) 十二月 11, 2017 2:55:00 下午 org.apache.catalina.core.StandardContext listenerStart at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:482) 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:431) org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [spring-ActiveMQ.xml]; nested exception is org.springframework.beans.FatalBeanException: NamespaceHandler class [org.apache.xbean.spring.context.v2.XBeanNamespaceHandler] for namespace [http://activemq.apache.org/schema/core] not found; nested exception is java.lang.ClassNotFoundException: org.apache.xbean.spring.context.v2.XBeanNamespaceHandler at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:414) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217) at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468) at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125) at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76) at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94) at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129) at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:614) at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:515) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4727) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5189) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at sun.rmi.transport.Transport$1.run(Transport.java:200) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752) at sun.rmi.transport.Transport$1.run(Transport.java:197) at java.security.AccessController.doPrivileged(Native Method) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728) at sun.rmi.transport.Transport.serviceCall(Transport.java:196) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1702) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.security.AccessController.doPrivileged(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.lang.reflect.Method.invoke(Method.java:498) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) at java.lang.Thread.run(Thread.java:748) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) Caused by: org.springframework.beans.FatalBeanException: NamespaceHandler class [org.apache.xbean.spring.context.v2.XBeanNamespaceHandler] for namespace [http://activemq.apache.org/schema/core] not found; nested exception is java.lang.ClassNotFoundException: org.apache.xbean.spring.context.v2.XBeanNamespaceHandler at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) at org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver.resolve(DefaultNamespaceHandlerResolver.java:136) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:482) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1405) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:431) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1400) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:172) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:142) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) ... 58 more at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) Caused by: java.lang.ClassNotFoundException: org.apache.xbean.spring.context.v2.XBeanNamespaceHandler at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285) at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119) at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309) at org.springframework.util.ClassUtils.forName(ClassUtils.java:250) at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401) at org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver.resolve(DefaultNamespaceHandlerResolver.java:125) at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) ... 65 more at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [springDemo][INFO] [2017-12-11 14:55:00] org.springframework.context.support.AbstractApplicationContext.doClose(984) | Closing Root WebApplicationContext: startup date [Mon Dec 11 14:54:57 CST 2017]; root of context hierarchy at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346) at sun.rmi.transport.Transport$1.run(Transport.java:200) at sun.rmi.transport.Transport$1.run(Transport.java:197) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:196) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748) Caused by: org.springframework.beans.FatalBeanException: NamespaceHandler class [org.apache.xbean.spring.context.v2.XBeanNamespaceHandler] for namespace [http://activemq.apache.org/schema/core] not found; nested exception is java.lang.ClassNotFoundException: org.apache.xbean.spring.context.v2.XBeanNamespaceHandler at org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver.resolve(DefaultNamespaceHandlerResolver.java:136) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1405) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1400) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:172) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:142) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392) ... 58 more Caused by: java.lang.ClassNotFoundException: org.apache.xbean.spring.context.v2.XBeanNamespaceHandler at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119) at org.springframework.util.ClassUtils.forName(ClassUtils.java:250) at org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver.resolve(DefaultNamespaceHandlerResolver.java:125) ... 65 more 11-Dec-2017 14:55:00.136 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file 11-Dec-2017 14:55:00.137 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors 十二月 11, 2017 2:55:00 下午 org.apache.catalina.core.ApplicationContext log 信息: Closing Spring root WebApplicationContext 十二月 11, 2017 2:55:00 下午 org.apache.catalina.core.StandardContext listenerStop 严重: Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListener java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:170) at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1032) at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1008) at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:958) at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:583) at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:116) at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4774) at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5411) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:226) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1702) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:482) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:431) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468) at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76) at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309) at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401) at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346) at sun.rmi.transport.Transport$1.run(Transport.java:200) at sun.rmi.transport.Transport$1.run(Transport.java:197) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:196) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748) [2017-12-11 02:55:00,167] Artifact springDemo:war exploded: Error during artifact deployment. See server log for details. View Code 需要引入的架包是: <dependency> <groupId>org.apache.xbean</groupId> <artifactId>xbean-spring</artifactId> <version>4.6</version> </dependency> 完整的pom.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sxd</groupId> <artifactId>springDemo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>4.3.13.RELEASE</spring.version> <hibernate.version>4.3.8.Final</hibernate.version> <jackson.version>2.5.0</jackson.version> </properties> <dependencies> <!--ActiveMQ--> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-core</artifactId> <version>5.7.0</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> <version>5.12.1</version> </dependency> <dependency> <groupId>org.apache.xbean</groupId> <artifactId>xbean-spring</artifactId> <version>4.6</version> </dependency> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <!-- 使用SpringMVC需配置 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- spring cglib 代理 --> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency> <!-- 关系型数据库整合时需配置 如hibernate jpa等 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <!-- hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>${hibernate.version}</version> </dependency> <!-- 二级缓存ehcache --> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.9.0</version> </dependency> <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- mysql连接 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <!-- c3p0数据源 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5-pre10</version> </dependency> <!-- json --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- aop --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.4</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0-alpha-1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> </project> View Code
报错: ===================================================================================================== 项目启动部署报错: java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.doWithLocalFields(Ljava/lang/Class;Lorg/springframework/util/ReflectionUtils$FieldCallback;)V at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.buildPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:418) at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:397) at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(PersistenceAnnotationBeanPostProcessor.java:333) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:872) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:495) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 只粘贴了部分错误在这里。 错误具体是什么,不重要,关键是这类型问题 java.lang.NoSuchMethodError 怎么解决才是最关键的问题!!! 分析: ========================================================================================== 海量的帖子/文章中都声明了这个问题的根源所在。 不是调用这个类,类中方法不存在; 就是这个方法在多个类中都有; 翻来覆去就是架包不匹配啦,版本不一致啦,冲突啦,啦啦啦乱七八糟的。好吧,怎么解决呢? 解决: ========================================================================================== ①不管你用的什么IDE,无论ecplise还是myecplise又或者idea。在解决这个问题之前,你需要懂得一件事,就是会在项目启动前,配置JVM参数。 参考:http://www.cnblogs.com/sxdcgaq8080/p/8022096.html一看就懂了。 ②添加一个VM参数 -XX:+TraceClassLoading ③保存后重启项目 ④发现报错和上面是哪个架包出现了问题 那么去检查 1》是不是这个架包没有下载下来 2》是不是这个架包中这个类下没有这个方法 3》是否要更换架包版本来解决这个问题 4》是否别的架包也有这个相同类的相同方法,导致找不到本方法 按照这样的思路解决问题即可。 ⑤仅对应本次截图出现的问题,解决方法 在Stack Overflow找到相同的问题,由于对spring源码并非特别熟悉,只是提出在4.2以后上面报错的方法就被提到了spring-core架包中而不是在orm架包中,所以,需要将spring-orm架包的版本降低到<4.2以下。即可解决问题!! 我更改spring版本就是统一更改的,完整的pom.xml文件在最后给出。 ========================================================================================= spring整合activeMQ的完整pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sxd</groupId> <artifactId>springDemo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>4.1.9.RELEASE</spring.version> <hibernate.version>4.3.8.Final</hibernate.version> <jackson.version>2.5.0</jackson.version> </properties> <dependencies> <!--ActiveMQ--> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.12.1</version> </dependency> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <!-- 使用SpringMVC需配置 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- spring cglib 代理 --> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency> <!-- 关系型数据库整合时需配置 如hibernate jpa等 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <!-- hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>${hibernate.version}</version> </dependency> <!-- 二级缓存ehcache --> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.9.0</version> </dependency> <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- mysql连接 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <!-- c3p0数据源 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5-pre10</version> </dependency> <!-- json --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- aop --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.4</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0-alpha-1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> </project> View Code
My/ecplise下都是一样的: IDEA下:
用了几个月的idea,在它升级之后,又不听话了。启动时候需要重新激活。 解决方法: 1.找到C:\Windows\System32\drivers\etc\下的hosts文件 在文件中添加如下: 0.0.0.0 account.jetbrains.com 【切记,一定要保存,保存,保存!】 2.粘贴注册码 EB101IWSWD-eyJsaWNlbnNlSWQiOiJFQjEwMUlXU1dEIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IkZvciBlZHVjYXRpb25hbCB1c2Ugb25seSIsImNoZWNrQ29uY3VycmVudFVzZSI6ZmFsc2UsInByb2R1Y3RzIjpbeyJjb2RlIjoiSUkiLCJwYWlkVXBUbyI6IjIwMTgtMTAtMTQifSx7ImNvZGUiOiJSUzAiLCJwYWlkVXBUbyI6IjIwMTgtMTAtMTQifSx7ImNvZGUiOiJXUyIsInBhaWRVcFRvIjoiMjAxOC0xMC0xNCJ9LHsiY29kZSI6IlJEIiwicGFpZFVwVG8iOiIyMDE4LTEwLTE0In0seyJjb2RlIjoiUkMiLCJwYWlkVXBUbyI6IjIwMTgtMTAtMTQifSx7ImNvZGUiOiJEQyIsInBhaWRVcFRvIjoiMjAxOC0xMC0xNCJ9LHsiY29kZSI6IkRCIiwicGFpZFVwVG8iOiIyMDE4LTEwLTE0In0seyJjb2RlIjoiUk0iLCJwYWlkVXBUbyI6IjIwMTgtMTAtMTQifSx7ImNvZGUiOiJETSIsInBhaWRVcFRvIjoiMjAxOC0xMC0xNCJ9LHsiY29kZSI6IkFDIiwicGFpZFVwVG8iOiIyMDE4LTEwLTE0In0seyJjb2RlIjoiRFBOIiwicGFpZFVwVG8iOiIyMDE4LTEwLTE0In0seyJjb2RlIjoiUFMiLCJwYWlkVXBUbyI6IjIwMTgtMTAtMTQifSx7ImNvZGUiOiJDTCIsInBhaWRVcFRvIjoiMjAxOC0xMC0xNCJ9LHsiY29kZSI6IlBDIiwicGFpZFVwVG8iOiIyMDE4LTEwLTE0In0seyJjb2RlIjoiUlNVIiwicGFpZFVwVG8iOiIyMDE4LTEwLTE0In1dLCJoYXNoIjoiNjk0NDAzMi8wIiwiZ3JhY2VQZXJpb2REYXlzIjowLCJhdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlLCJpc0F1dG9Qcm9sb25nYXRlZCI6ZmFsc2V9-Gbb7jeR8JWOVxdUFaXfJzVU/O7c7xHQyaidCnhYLp7v32zdeXiHUU7vlrrm5y9ZX0lmQk3plCCsW+phrC9gGAPd6WDKhkal10qVNg0larCR2tQ3u8jfv1t2JAvWrMOJfFG9kKsJuw1P4TozZ/E7Qvj1cupf/rldhoOmaXMyABxNN1af1RV3bVhe4FFZe0p7xlIJF/ctZkFK62HYmh8V3AyhUNTzrvK2k+t/tlDJz2LnW7nYttBLHld8LabPlEEjpTHswhzlthzhVqALIgvF0uNbIJ5Uwpb7NqR4U/2ob0Z+FIcRpFUIAHEAw+RLGwkCge5DyZKfx+RoRJ/In4q/UpA==-MIIEPjCCAiagAwIBAgIBBTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE1MTEwMjA4MjE0OFoXDTE4MTEwMTA4MjE0OFowETEPMA0GA1UEAwwGcHJvZDN5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcQkq+zdxlR2mmRYBPzGbUNdMN6OaXiXzxIWtMEkrJMO/5oUfQJbLLuMSMK0QHFmaI37WShyxZcfRCidwXjot4zmNBKnlyHodDij/78TmVqFl8nOeD5+07B8VEaIu7c3E1N+e1doC6wht4I4+IEmtsPAdoaj5WCQVQbrI8KeT8M9VcBIWX7fD0fhexfg3ZRt0xqwMcXGNp3DdJHiO0rCdU+Itv7EmtnSVq9jBG1usMSFvMowR25mju2JcPFp1+I4ZI+FqgR8gyG8oiNDyNEoAbsR3lOpI7grUYSvkB/xVy/VoklPCK2h0f0GJxFjnye8NT1PAywoyl7RmiAVRE/EKwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQC9WZuYgQedSuOc5TOUSrRigMw4/+wuC5EtZBfvdl4HT/8vzMW/oUlIP4YCvA0XKyBaCJ2iX+ZCDKoPfiYXiaSiH+HxAPV6J79vvouxKrWg2XV6ShFtPLP+0gPdGq3x9R3+kJbmAm8w+FOdlWqAfJrLvpzMGNeDU14YGXiZ9bVzmIQbwrBA+c/F4tlK/DV07dsNExihqFoibnqDiVNTGombaU2dDup2gwKdL81ua8EIcGNExHe82kjF4zwfadHk3bQVvbfdAwxcDy4xBjs3L4raPLU3yenSzr/OEur1+jfOxnQSmEcMXKXgrAQ9U55gwjcOFKrgOxEdek/Sk1VfOjvS+nuM4eyEruFMfaZHzoQiuw4IqgGc45ohFH0UUyjYcuFxxDSU9lMCv8qdHKm+wnPRb0l9l5vXsCBDuhAGYD6ss+Ga+aDY6f/qXZuUCEUOH3QUNbbCUlviSz6+GiRnt1kA9N2Qachl+2yBfaqUqr8h7Z2gsx5LcIf5kYNsqJ0GavXTVyWh7PYiKX4bs354ZQLUwwa/cG++2+wNWP+HtBhVxMRNTdVhSm38AknZlD+PTAsWGu9GyLmhti2EnVwGybSD2Dxmhxk3IPCkhKAK+pl0eWYGZWG3tJ9mZ7SowcXLWDFAk0lRJnKGFMTggrWjV8GYpw5bq23VmIqqDLgkNzuoog== 【注册码来源:http://idea.lanyus.com/】 3.验证通过,注册成功!! ===================================================================================== 如果上述不可使用,可以参考http://blog.csdn.net/gnail_oug/article/details/70677272进行破解!!
今天spring4.3.13 项目,整合ActiveMQ的时候,项目启动在自动部署到tomcat下的时候,不能正常的部署,仅仅报错如下: Connected to server [2017-12-08 03:57:12,428] Artifact springDemo:war exploded: Artifact is being deployed, please wait... 08-Dec-2017 15:57:13.525 信息 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 08-Dec-2017 15:57:13.553 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file 08-Dec-2017 15:57:13.554 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors [2017-12-08 03:57:13,565] Artifact springDemo:war exploded: Error during artifact deployment. See server log for details. 而且,此时tomcat下日志目录下并没有报错的日志文件 可恶的是,我自己配置的日志配置文件 解决方案: 只要是能看到详细的报错日志,要解决问题就迎刃而解了,可是得有日志文件出来呀 所以,在classpath:下新建一个logging.properties文件【classpath就是你项目的/目录下】 handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler ############################################################ # Handler specific properties. # Describes specific configuration info for Handlers. ############################################################ org.apache.juli.FileHandler.level = FINE org.apache.juli.FileHandler.directory = ../logs org.apache.juli.FileHandler.prefix = error-debug. java.util.logging.ConsoleHandler.level = FINE java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 然后重新启动项目 在你tomcat的logs,目录下查看日志文件 或直接在console下查看错误: 去解决问题就好了!!!!!!
在idea中写代码过程中。有这种报错出现: Usage of API documented as @since 1.8+ more.. 修改JDK版本的几个地方 最后,在pom.xml文件中添加: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> 即可解决问题了。
想试试AOP在spring的web项目上的使用情况,所以想尽快使用idea快速的搭建一个spring的web项目,当然,是maven管理的项目 步骤如下: 1。打开idea 左上角file--->new --->project 2。选择Maven项目 好了,生成出来是下面这个狗样子 3.好了,新建web相关目录 建完把webapp目录设置成web的根目录,并且将web生成的web.xml文件放在WEB-INF位置下,往下看,操作就行 完了就是下面的狗样子 4.完善pom.xml文件 如果你是用的默认的maven本地仓库,也就是在本地的C:\Users\自己PC的用户名\.m2下的仓库的话,就不用更改什么,直接完善pom.xml文件。 如果你使用了自定义的maven仓库,那需要先设置一下本项目所作用的maven的setting.xml文件。 然后完善pom.xml文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sxd</groupId> <artifactId>aopExample</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>4.1.4.RELEASE</spring.version> <hibernate.version>4.3.8.Final</hibernate.version> <jackson.version>2.5.0</jackson.version> </properties> <dependencies> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <!-- 使用SpringMVC需配置 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- spring cglib 代理 --> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency> <!-- 关系型数据库整合时需配置 如hibernate jpa等 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <!-- hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>${hibernate.version}</version> </dependency> <!-- 二级缓存ehcache --> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.9.0</version> </dependency> <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- mysql连接 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <!-- c3p0数据源 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5-pre10</version> </dependency> <!-- json --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- aop --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.4</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0-alpha-1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> </project> View Code 5.接下来,是各个配置文件的配置,之前有在myecplise上配置过,配置是一样的 可以参考:【http://www.cnblogs.com/sxdcgaq8080/p/5606827.html】 再resources目录下,分别创建如下文件: config.properties #jdbc c3p0 config jdbc.driver = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/orderdiscount?useUnicode=true&characterEncoding=utf-8 jdbc.username = root jdbc.password = root #hibernate config hibernate.dialect = org.hibernate.dialect.MySQLDialect hibernate.show_sql = true hibernate.format_sql = false hibernate.hbm2ddl.auto = update hibernate.cache.use_second_level_cache = true hibernate.cache.use_query_cache = true hibernate.cache.region.factory_class = org.hibernate.cache.ehcache.EhCacheRegionFactory hibernate.cache.provider_configuration_file_resource_path =ehcache.xml View Code log4j.properties ### set log levels ### log4j.rootLogger = INFO , C , D , E ### console ### log4j.appender.C = org.apache.log4j.ConsoleAppender log4j.appender.C.Target = System.out log4j.appender.C.layout = org.apache.log4j.PatternLayout log4j.appender.C.layout.ConversionPattern = [aopExample][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n ### log file ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = ../logs/springmvc_hibernate_demo.log log4j.appender.D.Append = true log4j.appender.D.Threshold = INFO log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = [aopExample][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n ### exception ### log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File = ../logs/aopExample_error.log log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern =[aopExample][%p] [%-d{yyyy-MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n View Code spring-hibernate.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd "> <!-- 自动扫描@Controller注入为bean --> <context:property-placeholder location="classpath:config.properties"/> <!-- 配置数据源 c3p0 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${jdbc.driver}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- 请求超时时间 --> <property name="checkoutTimeout" value="30000" /> <!-- 每60秒检查所有连接池中的空闲连接。默认值: 0,不检查 --> <property name="idleConnectionTestPeriod" value="30" /> <!-- 连接数据库连接池最大空闲时间 --> <property name="maxIdleTime" value="30" /> <!-- 连接池初始化连接数 --> <property name="initialPoolSize" value="5" /> <property name="minPoolSize" value="5" /> <property name="maxPoolSize" value="20" /> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。默认值: 3 --> <property name="acquireIncrement" value="5" /> </bean> <!-- 配置hibernate的SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!-- 注入数据源 相关信息看源码 --> <property name="dataSource" ref="dataSource" /> <!-- hibernate配置信息 --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <!-- 开启二级缓存 ehcache --> <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop> <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop> <prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop> <prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.cache.provider_configuration_file_resource_path} </prop> </props> </property> <!-- 扫描hibernate注解配置的entity --> <property name="packagesToScan" value="com.sxd.entity" /> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> </beans> View Code ehcache.xml <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="D:/ehcache" /> <!-- DefaultCache setting. --> <defaultCache maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="1000000" overflowToDisk="true" memoryStoreEvictionPolicy="LRU"> </defaultCache> <!-- Special objects setting. --> <cache name="org.andy.work.entity.AcctUser" maxElementsInMemory="2" memoryStoreEvictionPolicy="LRU" eternal="true" diskPersistent="false" overflowToDisk="false" maxElementsOnDisk="1000000" /> </ehcache> View Code spring-mvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> <!-- 自动扫描@Controller注入为bean --> <context:component-scan base-package="com.sxd" > </context:component-scan> <!-- 标明注解事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- 以下为SpringMVC配置 --> <mvc:annotation-driven> <!-- 返回json数据,@response使用 --> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/views" /> <property name="suffix" value=".jsp" /> </bean> <!--Spring aop事务管理 <aop:config proxy-target-class="true"> 配置切入点 指定这个aop:pointcut去引用上面规定的advice,也就是说规定下面的这个expression指定的路径下的service.impl下的所有的方法,都按照上面advice中的规定去执行,碰上什么操作,事务就是什么类型的,这就是事务管理器的好处了 解释一下,为什么这个要指定在service层:因为在同一个事务中,可能要对多张表进行多个不同的操作,才是一个完整的逻辑,例如淘宝上买东西,你转账之后你的钱减少了,对方的钱应该增加了,这两个操作在一起才是一个完整的操作,而如果这两个操作不在一个事务中,也就是如果将事务的操作指定在Dao层【MVC的设计模式:Dao层就是对数据库进行最简单的增删改查操作,而service层是进行逻辑处理的,一个完整的逻辑处理就要涉及到多次操作】事务操作失败,发生回滚,那你的帐减少了,对方的帐并没有增加,这样就不美丽的,因此,将事务的管理,指定在了service层 <aop:pointcut id="transactionPointcut" expression="execution(* com.it.service..*Impl.*(..))" />expression中表达式所指意思: 所有的文件下的 com.it.service开头的包,以Impl结尾的类下的所有的方法,都执行上面advice的规定 指定在txAdvice切入点应用txAdvice事务增强处理 <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" /> </aop:config> --> </beans> View Code 6.完善java中的包controller,并建立一个页面跳转MainController.java MainController.java package com.sxd.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MainController { @ResponseBody @RequestMapping("do") public String doSomething(){ return "Just for what"; } } View Code 7.最恶心的一步,也是不同与ecplise的步骤,为本项目部署一个Tomcat 选上自己的项目即可 8.最后一步,完善web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!-- web容器是web项目的大脑 --> <!-- 在web.xml中,执行顺序是:1.先执行listener 2。再执行filter 3.最后执行servlet 这就是执行顺序 就像spring-hibernate.xml文件是在执行Listener的时候加载的,那注意这几个配置文件在web.xml中的加载顺序,因为资源文件是在配置文件【xml文件】中加载的,肯定是先加载的资源文件【properties文件】,才能在配置文件中调用资源文件中的变量的值使用 --> <display-name>aopExample</display-name> <!-- web容器,首先需要引入spring,让spring管理各个框架,并将其注入为bean --> <!-- 这个相当于定一个 变量在web.xml中,在下面的listener org.springframework.web.context.ContextLoaderListener中,加载这个spring-hibernate.xml文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-hibernate.xml</param-value> </context-param> <!-- 配置控制层的filter信息 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- openSessionInView配置 作用是延迟session关闭到view层 --> <filter> <filter-name>openSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>singleSession</param-name> <param-value>true</param-value> </init-param> </filter> <!-- 监听servletContext,启动contextConfigLocation中的spring配置信息 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 防止spring内存溢出监听器 可用可不用--> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <!-- 类似与servlet 需要在web.xml中都需要配置一样,spring的思想是让这些servlet【controller也是servlet】继承了一个基础的servlet,那就只需在web.xml中配置一个servlet即可。 --> <!-- 这个servlet和下面的servlet-mapping相配合使用,注明了所有的以.htmls结尾的请求都被截取到,去到servlet中去找相对应的方法 进行处理 --> <servlet> <description>spring mvc servlet</description> <servlet-name>rest</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!-- 此处配置的是SpringMVC的配置文件 --> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- 配置了springmvc拦截的url为以.hmls结尾的请求 --> <servlet-mapping> <servlet-name>rest</servlet-name> <url-pattern>*.htmls</url-pattern> </servlet-mapping> <filter-mapping> <filter-name>openSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 配置session超时时间,单位分钟 --> <session-config> <session-timeout>30</session-timeout> </session-config> <!-- 欢迎界面 默认的项目访问界面 --> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> </web-app> View Code 9.最后,就可以启动了,启动完成之后,浏览器访问地址: ======================================================================================== 好啦!!!
idea插件很齐全,不像ecplise一样。所以直接来步骤吧: 1.选择项目,右键-->Add Frameworks Support-->勾选Hibernate-->勾选Import database schema-->OK 注意:如果第一步你进去之后,发现没有hibernate这一项,怎么办? File-->project Structure -->Modules--->选中hibernate 之后,选择减号按钮,删除-->apply应用之后再走上面的步骤 2。选定是哪个数据库 选择了之后,中间的 Database schema mapping还是不显示出来数据表,所以 再次进去,直接选中哪个数据表下的那个schema。 如果这张表的关联表你也要生成的话,请自己下拉这张要生成的表,然后将其中有外键关系的列也勾选上就可以了。 3.生成数据表对应的实体之后,将下面的文件删掉,留下实体使用即可。
2天时间,终于把spring boot下配置连接多种不同类型数据库,配置多数据源实现! ====================================================================================================== spring boot对多种不同类型数据库,多数据源配置使用 多数据源配置相关官方API:https://docs.spring.io/spring-boot/docs/current/api/ 环境如下: 开发环境IDE:IntelliJ IDEA spring boot版本:1.5.9 hibernate版本:5.0.12 多数据源: sql server2008 和 mysql 5.5 ====================================================================================================== 实现多数据源的配置连接,主要思路如下: 1》首先在application.properties中配置两个数据源 和必要的JPA相关配置 2》DataSourceConfig总装载类,分别声明多个数据源【并指定其中一个数据源为主数据源】 3》分别创建多个数据源的具体装载类,例如MyagenDataSourceConfig,并在具体装载类中,注入并完善JpaProperties,声明并引用实体管理和事务管理,并在过程中指定了本数据源要作用的包的范围 4》根据第3步中指定的包,分别对应多个数据源的具体装载类,创建包结构,以及生成实体和对应的repository层操作 5》最后再controller层,依次调用各种数据源对应的各个包下的各种repository操作进行操作 那么主要实现目录如下: ====================================================================================================== 下面依照思路,一步一步看实现: 1》首先在application.properties中配置两个数据源 和必要的JPA相关配置 完整代码: application.properties #datasource myagen.spring.datasource.url=jdbc:sqlserver://localhost:1433;databasename=geneShop myagen.spring.datasource.username=sa myagen.spring.datasource.password=398023 myagen.spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver orderdiscount.spring.datasource.url=jdbc:mysql://localhost:3306/orderdiscount orderdiscount.spring.datasource.username=root orderdiscount.spring.datasource.password=root orderdiscount.spring.datasource.driver-class-name=com.mysql.jdbc.Driver #jpa 需要单独提出来 spring.jpa.show-sql=true 1.这个实现的例子中。使用的多数据源是不同数据库类型下的多数据源。 2.然后仅需要在application.properties中配置spring.datasource下的必要属性,当然,除了这4个必要属性之外,还有很多关于spring.datasource的配置,具体可以查看,spring boot官方完整文档:http://www.cnblogs.com/sxdcgaq8080/p/7724506.html,进入搜索【spring.datasource】,就可以找到完整的关于它的配置属性名。 3.这里分别对多数据源前面的属性命名分别添加了标识用于标识不同的数据源。例如: myagen.spring.datasource.url 和 orderdiscount.spring.datasource.url 具体这个标识怎么用,就是用于在第二步中取前缀分别装载不同数据源的时候用。需要明白一点:application.properties文件中定义键名为什么都不会报错,但是如果不符合规范且你自己没有去处理,那你配置的键值对并不会被加载而起作用。 4.再说spring.jpa.show-sql,这个属性名不会因为在不同数据库下就不起作用了,所以,直接配置在这里即可。 5.最后要说的是hibernate.dialect,方言等等和不同类型数据库有关联的属性值,不能配置在配置文件中,因为没办法解析,所以这个要放在第3步中处理,如果需要查看这个,可以直接跳到第三步 =================================================================================================================================== 2》DataSourceConfig总装载类,分别声明多个数据源【并指定其中一个数据源为主数据源】 1.这个DataSourceConfig总的装载类,就是根据上面配置文件中不同的前缀获取到不同的几个键值对的值,封装进了DataSource数据源,例如前缀: myagen.spring.datasource 2.需要注意的是这个类需要@Configuration注解标注本类需要被扫描到 3.在有多个数据源的情况下,必须要指定其中一个为主数据源,通过 @Primary 完整代码: DataSourceConfig.java package com.agen.config; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; /** * @author SXD * @date 2017/12/04 * 多数据源装载配置类 * 数据源的声明 */ @Configuration public class DataSourceConfig { /** * @return 我的基因网数据库 */ @Bean(name = "myagenDataSource") @Qualifier(value = "myagenDataSource") //spring装配bean的唯一标识 @ConfigurationProperties(prefix = "myagen.spring.datasource") //application.properties配置文件中该数据源的配置前缀 public DataSource myagenDataSource(){ return DataSourceBuilder.create().build(); } /** * @return 基因网订单返现数据库 */ @Primary //配置该数据源为主数据源 @Bean(name = "orderDiscountDataSource") @Qualifier(value = "orderDiscountDataSource") @ConfigurationProperties(prefix = "orderdiscount.spring.datasource") public DataSource orderDiscountDataSource(){ return DataSourceBuilder.create().build(); } } View Code =============================================================================================================================================== 3》分别创建多个数据源的具体装载类,例如MyagenDataSourceConfig,并在具体装载类中,注入并完善JpaProperties,声明并引用实体管理和事务管理,并在过程中指定了本数据源要作用的包的范围 主数据源完整代码: OrderDiscountDataSourceConfig.java package com.agen.config.datasource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.Database; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.persistence.EntityManager; import javax.sql.DataSource; import java.util.HashMap; import java.util.Map; /** * @author SXD * @date 2017/12/04 * mysql数据库中数据源的 声明装载类 * */ @Configuration @EnableTransactionManagement @EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryOrderDiscount", //EntityManagerFactory引用 transactionManagerRef = "transactionManagerOrderDiscount", //transactionManager引用 basePackages = {"com.agen.orderdiscount"}) //设置 基因网orderDiscountDataSource应用到的包 public class OrderDiscountDataSourceConfig { /** * 注入 基因网订单折扣数据源 */ @Autowired() @Qualifier("orderDiscountDataSource") private DataSource orderDiscountDataSource; /** * 注入JPA配置实体 */ @Autowired private JpaProperties jpaProperties; /** * 通过调用JPA配置实体中的解析方法,解析datasource中各属性的值 * @param dataSource 数据源 * @return 本数据源中各参数 * Map中设值分别为: * hibernate-dialect 方言 * hibernate.hbm2ddl.auto DDL执行策略 * hibernate.physical_naming_strategy 命名策略 * *这些和不同类型数据库密切相关的属性设置,不能设置在application.properties中,所以需要再不同的数据源中具体设置,赋值给JpaProperties */ private Map<String,String> getVendorProperties(DataSource dataSource){ jpaProperties.setDatabase(Database.MYSQL); Map<String,String> map = new HashMap<>(); map.put("hibernate.dialect","org.hibernate.dialect.MySQL5Dialect"); map.put("hibernate.hbm2ddl.auto","update"); map.put("hibernate.physical_naming_strategy","org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl"); jpaProperties.setProperties(map); return jpaProperties.getHibernateProperties(dataSource); } /** * 配置EntityManagerFactory实体 * @param builder * @return 实体管理工厂 * packages 扫描@Entity注释的软件包名称 * persistenceUnit 持久性单元的名称。 如果只建立一个EntityManagerFactory,你可以省略这个,但是如果在同一个应用程序中有多个,你应该给它们不同的名字 * properties 标准JPA或供应商特定配置的通用属性。 这些属性覆盖构造函数中提供的任何值。 * */ @Primary @Bean(name = "entityManagerFactoryOrderDiscount") public LocalContainerEntityManagerFactoryBean entityManagerFactoryOrderDiscount(EntityManagerFactoryBuilder builder){ return builder .dataSource(orderDiscountDataSource) .properties(getVendorProperties(orderDiscountDataSource)) .packages(new String[]{"com.agen.orderdiscount"}) .persistenceUnit("orderDiscountPersistenceUnit") .build(); } /** * 配置EntityManager实体 * @param builder * @return 实体管理器 */ @Primary @Bean(name = "entityManagerOrderDiscount") public EntityManager entityManager(EntityManagerFactoryBuilder builder){ return entityManagerFactoryOrderDiscount(builder).getObject().createEntityManager(); } /** * 配置事务transactionManager * @param builder * @return 事务管理器 */ @Primary @Bean(name = "transactionManagerOrderDiscount") public PlatformTransactionManager transactionManagerOrderDiscount(EntityManagerFactoryBuilder builder){ return new JpaTransactionManager(entityManagerFactoryOrderDiscount(builder).getObject()); } } View Code 其他数据源完整代码: MyagenDataSourceConfig.java package com.agen.config.datasource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.Database; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.persistence.EntityManager; import javax.sql.DataSource; import java.util.HashMap; import java.util.Map; /** * @author SXD * @date 2017/12/04 * sql server数据库中数据源的 声明装载类 * */ @Configuration @EnableTransactionManagement @EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryMyagen", //实体管理引用 transactionManagerRef = "transactionManagerMyagen", //事务管理引用 basePackages = {"com.agen.myagen"}) //设置 myagenDataSource应用到的包 public class MyagenDataSourceConfig { /** * 注入 我的基因网数据源 */ @Autowired() @Qualifier("myagenDataSource") private DataSource myagenDataSource; /** * 注入JPA配置实体 */ @Autowired private JpaProperties jpaProperties; /** * 通过调用JPA配置实体中的解析方法,解析datasource中各属性的值 * @param dataSource 数据源 * @return 本数据源中各参数 * Map中设值分别为: * hibernate-dialect 方言 * hibernate.hbm2ddl.auto DDL执行策略 * hibernate.physical_naming_strategy 命名策略 * *这些和不同类型数据库密切相关的属性设置,不能设置在application.properties中,所以需要再不同的数据源中具体设置,赋值给JpaProperties */ private Map<String, String> getVendorProperties(DataSource dataSource) { jpaProperties.setDatabase(Database.SQL_SERVER); Map<String,String> map = new HashMap<>(); map.put("hibernate.dialect","org.hibernate.dialect.SQLServer2008Dialect"); map.put("hibernate.hbm2ddl.auto","update"); map.put("hibernate.physical_naming_strategy","org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl"); jpaProperties.setProperties(map); return jpaProperties.getHibernateProperties(dataSource); } /** * 配置EntityManagerFactory实体 * * @param builder * @return * packages 扫描@Entity注释的软件包名称 * persistenceUnit 持久性单元的名称。 如果只建立一个EntityManagerFactory,你可以省略这个,但是如果在同一个应用程序中有多个,你应该给它们不同的名字 * properties 标准JPA或供应商特定配置的通用属性。 这些属性覆盖构造函数中提供的任何值。 */ @Bean(name = "entityManagerFactoryMyagen") public LocalContainerEntityManagerFactoryBean entityManagerFactoryMyagen(EntityManagerFactoryBuilder builder) { return builder .dataSource(myagenDataSource) .properties(getVendorProperties(myagenDataSource)) .packages(new String[]{"com.agen.myagen"}) .persistenceUnit("myagenPersistenceUnit") .build(); } /** * 配置EntityManager实体 * * @param builder * @return 实体管理器 */ @Bean(name = "entityManagerMyagen") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactoryMyagen(builder).getObject().createEntityManager(); } /** * 配置事务 * * @param builder * @return 事务管理器 */ @Bean(name = "transactionManagerMyagen") public PlatformTransactionManager transactionManagerMyagen(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryMyagen(builder).getObject()); } } View Code 1.主数据源和其他数据源最大的区别在于,主数据源中 的实体管理器,实体工厂管理器,事务管理器在声明加载时 ,要声明自己是主数据源的,通过 @Primary 2.在实体工厂管理器中,需要设置 persistenceUnit 如果仅有一个数据源的话,不需要设置这个,但是多数据源的情况下,需要设置其为不同的值即可,没有具体的命名规则。 3.指定本数据源要扫描的包名,可以指定多个包,也可以将entity和repository放在同一个包下,这样仅需要指定一个即可被扫描到。 4.关于application.properties中有关和数据库操作相关的部分属性值的默认值是什么设置的: 查看JpaProperties源码,默认的为hibernate命名生成策略: 而这种命名生成策略是为若有驼峰命名出现orderId,则数据库中会有order_id下划线出现。我自己不想采用这种。 DDL策略: ================================================================================================================================================================= 4》根据第3步中指定的包,分别对应多个数据源的具体装载类,创建包结构,以及生成实体和对应的repository层操作 XxOrder.java package com.agen.myagen.entity; import javax.persistence.*; import java.math.BigDecimal; import java.sql.Timestamp; @Entity @Table(name = "xx_order", schema = "dbo", catalog = "geneshop") public class XxOrder { private int id; private Timestamp createDate; private Timestamp modifyDate; private String address; private BigDecimal amountPaid; private String areaName; private String consignee; private BigDecimal couponDiscount; private int exchangePoint; private Timestamp expire; private BigDecimal fee; private BigDecimal freight; private String invoiceTitle; private boolean isAllocatedStock; private boolean isInvoice; private Timestamp lockExpire; private String memo; private String name; private BigDecimal offsetAmount; private int orderStatus; private String paymentMethodName; private int paymentStatus; private String phone; private BigDecimal promotionDiscount; private String promotionName; private int rewardPoint; private String shippingMethodName; private int shippingStatus; private String sn; private BigDecimal tax; private int type; private String zipCode; private String memberorderno; private Integer ordertype; private Boolean distributeState; private Timestamp ctime; private String guid; private String cbqrr; private Timestamp cbqrTime; private Boolean isCbqr; private Boolean isSrqr; private String srqrr; private Timestamp srqrTime; private String isShow; private Boolean isHunantb; private Boolean byCreditCard; private XxMember xxMemberByMember; private XxAdmin xxAdminByOperator; private XxAdmin xxAdminByAdmin; @Id @Column(name = "id", nullable = false, precision = 0) public int getId() { return id; } public void setId(int id) { this.id = id; } @Basic @Column(name = "create_date", nullable = false) public Timestamp getCreateDate() { return createDate; } public void setCreateDate(Timestamp createDate) { this.createDate = createDate; } @Basic @Column(name = "modify_date", nullable = false) public Timestamp getModifyDate() { return modifyDate; } public void setModifyDate(Timestamp modifyDate) { this.modifyDate = modifyDate; } @Basic @Column(name = "address", nullable = false, length = 255) public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Basic @Column(name = "amount_paid", nullable = false, precision = 6) public BigDecimal getAmountPaid() { return amountPaid; } public void setAmountPaid(BigDecimal amountPaid) { this.amountPaid = amountPaid; } @Basic @Column(name = "area_name", nullable = false, length = 255) public String getAreaName() { return areaName; } public void setAreaName(String areaName) { this.areaName = areaName; } @Basic @Column(name = "consignee", nullable = false, length = 255) public String getConsignee() { return consignee; } public void setConsignee(String consignee) { this.consignee = consignee; } @Basic @Column(name = "coupon_discount", nullable = false, precision = 6) public BigDecimal getCouponDiscount() { return couponDiscount; } public void setCouponDiscount(BigDecimal couponDiscount) { this.couponDiscount = couponDiscount; } @Basic @Column(name = "exchange_point", nullable = false, precision = 0) public int getExchangePoint() { return exchangePoint; } public void setExchangePoint(int exchangePoint) { this.exchangePoint = exchangePoint; } @Basic @Column(name = "expire", nullable = true) public Timestamp getExpire() { return expire; } public void setExpire(Timestamp expire) { this.expire = expire; } @Basic @Column(name = "fee", nullable = false, precision = 6) public BigDecimal getFee() { return fee; } public void setFee(BigDecimal fee) { this.fee = fee; } @Basic @Column(name = "freight", nullable = false, precision = 6) public BigDecimal getFreight() { return freight; } public void setFreight(BigDecimal freight) { this.freight = freight; } @Basic @Column(name = "invoice_title", nullable = true, length = 255) public String getInvoiceTitle() { return invoiceTitle; } public void setInvoiceTitle(String invoiceTitle) { this.invoiceTitle = invoiceTitle; } @Basic @Column(name = "is_allocated_stock", nullable = false) public boolean isAllocatedStock() { return isAllocatedStock; } public void setAllocatedStock(boolean allocatedStock) { isAllocatedStock = allocatedStock; } @Basic @Column(name = "is_invoice", nullable = false) public boolean isInvoice() { return isInvoice; } public void setInvoice(boolean invoice) { isInvoice = invoice; } @Basic @Column(name = "lock_expire", nullable = true) public Timestamp getLockExpire() { return lockExpire; } public void setLockExpire(Timestamp lockExpire) { this.lockExpire = lockExpire; } @Basic @Column(name = "memo", nullable = true, length = 255) public String getMemo() { return memo; } public void setMemo(String memo) { this.memo = memo; } @Basic @Column(name = "name", nullable = false, length = 500) public String getName() { return name; } public void setName(String name) { this.name = name; } @Basic @Column(name = "offset_amount", nullable = false, precision = 6) public BigDecimal getOffsetAmount() { return offsetAmount; } public void setOffsetAmount(BigDecimal offsetAmount) { this.offsetAmount = offsetAmount; } @Basic @Column(name = "order_status", nullable = false) public int getOrderStatus() { return orderStatus; } public void setOrderStatus(int orderStatus) { this.orderStatus = orderStatus; } @Basic @Column(name = "payment_method_name", nullable = true, length = 255) public String getPaymentMethodName() { return paymentMethodName; } public void setPaymentMethodName(String paymentMethodName) { this.paymentMethodName = paymentMethodName; } @Basic @Column(name = "payment_status", nullable = false) public int getPaymentStatus() { return paymentStatus; } public void setPaymentStatus(int paymentStatus) { this.paymentStatus = paymentStatus; } @Basic @Column(name = "phone", nullable = false, length = 255) public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Basic @Column(name = "promotion_discount", nullable = false, precision = 6) public BigDecimal getPromotionDiscount() { return promotionDiscount; } public void setPromotionDiscount(BigDecimal promotionDiscount) { this.promotionDiscount = promotionDiscount; } @Basic @Column(name = "promotion_name", nullable = true, length = 255) public String getPromotionName() { return promotionName; } public void setPromotionName(String promotionName) { this.promotionName = promotionName; } @Basic @Column(name = "reward_point", nullable = false, precision = 0) public int getRewardPoint() { return rewardPoint; } public void setRewardPoint(int rewardPoint) { this.rewardPoint = rewardPoint; } @Basic @Column(name = "shipping_method_name", nullable = true, length = 255) public String getShippingMethodName() { return shippingMethodName; } public void setShippingMethodName(String shippingMethodName) { this.shippingMethodName = shippingMethodName; } @Basic @Column(name = "shipping_status", nullable = false) public int getShippingStatus() { return shippingStatus; } public void setShippingStatus(int shippingStatus) { this.shippingStatus = shippingStatus; } @Basic @Column(name = "sn", nullable = false, length = 100) public String getSn() { return sn; } public void setSn(String sn) { this.sn = sn; } @Basic @Column(name = "tax", nullable = false, precision = 6) public BigDecimal getTax() { return tax; } public void setTax(BigDecimal tax) { this.tax = tax; } @Basic @Column(name = "type", nullable = false) public int getType() { return type; } public void setType(int type) { this.type = type; } @Basic @Column(name = "zip_code", nullable = false, length = 255) public String getZipCode() { return zipCode; } public void setZipCode(String zipCode) { this.zipCode = zipCode; } @Basic @Column(name = "memberorderno", nullable = true, length = 255) public String getMemberorderno() { return memberorderno; } public void setMemberorderno(String memberorderno) { this.memberorderno = memberorderno; } @Basic @Column(name = "ordertype", nullable = true) public Integer getOrdertype() { return ordertype; } public void setOrdertype(Integer ordertype) { this.ordertype = ordertype; } @Basic @Column(name = "distributeState", nullable = true) public Boolean getDistributeState() { return distributeState; } public void setDistributeState(Boolean distributeState) { this.distributeState = distributeState; } @Basic @Column(name = "ctime", nullable = true) public Timestamp getCtime() { return ctime; } public void setCtime(Timestamp ctime) { this.ctime = ctime; } @Basic @Column(name = "guid", nullable = true, length = 255) public String getGuid() { return guid; } public void setGuid(String guid) { this.guid = guid; } @Basic @Column(name = "cbqrr", nullable = true, length = 255) public String getCbqrr() { return cbqrr; } public void setCbqrr(String cbqrr) { this.cbqrr = cbqrr; } @Basic @Column(name = "cbqr_time", nullable = true) public Timestamp getCbqrTime() { return cbqrTime; } public void setCbqrTime(Timestamp cbqrTime) { this.cbqrTime = cbqrTime; } @Basic @Column(name = "is_cbqr", nullable = true) public Boolean getCbqr() { return isCbqr; } public void setCbqr(Boolean cbqr) { isCbqr = cbqr; } @Basic @Column(name = "is_srqr", nullable = true) public Boolean getSrqr() { return isSrqr; } public void setSrqr(Boolean srqr) { isSrqr = srqr; } @Basic @Column(name = "srqrr", nullable = true, length = 255) public String getSrqrr() { return srqrr; } public void setSrqrr(String srqrr) { this.srqrr = srqrr; } @Basic @Column(name = "srqr_time", nullable = true) public Timestamp getSrqrTime() { return srqrTime; } public void setSrqrTime(Timestamp srqrTime) { this.srqrTime = srqrTime; } @Basic @Column(name = "is_show", nullable = true, length = 255) public String getIsShow() { return isShow; } public void setIsShow(String isShow) { this.isShow = isShow; } @Basic @Column(name = "is_hunantb", nullable = true) public Boolean getHunantb() { return isHunantb; } public void setHunantb(Boolean hunantb) { isHunantb = hunantb; } @Basic @Column(name = "by_credit_card", nullable = true) public Boolean getByCreditCard() { return byCreditCard; } public void setByCreditCard(Boolean byCreditCard) { this.byCreditCard = byCreditCard; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; XxOrder xxOrder = (XxOrder) o; if (id != xxOrder.id) return false; if (exchangePoint != xxOrder.exchangePoint) return false; if (isAllocatedStock != xxOrder.isAllocatedStock) return false; if (isInvoice != xxOrder.isInvoice) return false; if (orderStatus != xxOrder.orderStatus) return false; if (paymentStatus != xxOrder.paymentStatus) return false; if (rewardPoint != xxOrder.rewardPoint) return false; if (shippingStatus != xxOrder.shippingStatus) return false; if (type != xxOrder.type) return false; if (createDate != null ? !createDate.equals(xxOrder.createDate) : xxOrder.createDate != null) return false; if (modifyDate != null ? !modifyDate.equals(xxOrder.modifyDate) : xxOrder.modifyDate != null) return false; if (address != null ? !address.equals(xxOrder.address) : xxOrder.address != null) return false; if (amountPaid != null ? !amountPaid.equals(xxOrder.amountPaid) : xxOrder.amountPaid != null) return false; if (areaName != null ? !areaName.equals(xxOrder.areaName) : xxOrder.areaName != null) return false; if (consignee != null ? !consignee.equals(xxOrder.consignee) : xxOrder.consignee != null) return false; if (couponDiscount != null ? !couponDiscount.equals(xxOrder.couponDiscount) : xxOrder.couponDiscount != null) return false; if (expire != null ? !expire.equals(xxOrder.expire) : xxOrder.expire != null) return false; if (fee != null ? !fee.equals(xxOrder.fee) : xxOrder.fee != null) return false; if (freight != null ? !freight.equals(xxOrder.freight) : xxOrder.freight != null) return false; if (invoiceTitle != null ? !invoiceTitle.equals(xxOrder.invoiceTitle) : xxOrder.invoiceTitle != null) return false; if (lockExpire != null ? !lockExpire.equals(xxOrder.lockExpire) : xxOrder.lockExpire != null) return false; if (memo != null ? !memo.equals(xxOrder.memo) : xxOrder.memo != null) return false; if (name != null ? !name.equals(xxOrder.name) : xxOrder.name != null) return false; if (offsetAmount != null ? !offsetAmount.equals(xxOrder.offsetAmount) : xxOrder.offsetAmount != null) return false; if (paymentMethodName != null ? !paymentMethodName.equals(xxOrder.paymentMethodName) : xxOrder.paymentMethodName != null) return false; if (phone != null ? !phone.equals(xxOrder.phone) : xxOrder.phone != null) return false; if (promotionDiscount != null ? !promotionDiscount.equals(xxOrder.promotionDiscount) : xxOrder.promotionDiscount != null) return false; if (promotionName != null ? !promotionName.equals(xxOrder.promotionName) : xxOrder.promotionName != null) return false; if (shippingMethodName != null ? !shippingMethodName.equals(xxOrder.shippingMethodName) : xxOrder.shippingMethodName != null) return false; if (sn != null ? !sn.equals(xxOrder.sn) : xxOrder.sn != null) return false; if (tax != null ? !tax.equals(xxOrder.tax) : xxOrder.tax != null) return false; if (zipCode != null ? !zipCode.equals(xxOrder.zipCode) : xxOrder.zipCode != null) return false; if (memberorderno != null ? !memberorderno.equals(xxOrder.memberorderno) : xxOrder.memberorderno != null) return false; if (ordertype != null ? !ordertype.equals(xxOrder.ordertype) : xxOrder.ordertype != null) return false; if (distributeState != null ? !distributeState.equals(xxOrder.distributeState) : xxOrder.distributeState != null) return false; if (ctime != null ? !ctime.equals(xxOrder.ctime) : xxOrder.ctime != null) return false; if (guid != null ? !guid.equals(xxOrder.guid) : xxOrder.guid != null) return false; if (cbqrr != null ? !cbqrr.equals(xxOrder.cbqrr) : xxOrder.cbqrr != null) return false; if (cbqrTime != null ? !cbqrTime.equals(xxOrder.cbqrTime) : xxOrder.cbqrTime != null) return false; if (isCbqr != null ? !isCbqr.equals(xxOrder.isCbqr) : xxOrder.isCbqr != null) return false; if (isSrqr != null ? !isSrqr.equals(xxOrder.isSrqr) : xxOrder.isSrqr != null) return false; if (srqrr != null ? !srqrr.equals(xxOrder.srqrr) : xxOrder.srqrr != null) return false; if (srqrTime != null ? !srqrTime.equals(xxOrder.srqrTime) : xxOrder.srqrTime != null) return false; if (isShow != null ? !isShow.equals(xxOrder.isShow) : xxOrder.isShow != null) return false; if (isHunantb != null ? !isHunantb.equals(xxOrder.isHunantb) : xxOrder.isHunantb != null) return false; if (byCreditCard != null ? !byCreditCard.equals(xxOrder.byCreditCard) : xxOrder.byCreditCard != null) return false; return true; } @Override public int hashCode() { int result = id; result = 31 * result + (createDate != null ? createDate.hashCode() : 0); result = 31 * result + (modifyDate != null ? modifyDate.hashCode() : 0); result = 31 * result + (address != null ? address.hashCode() : 0); result = 31 * result + (amountPaid != null ? amountPaid.hashCode() : 0); result = 31 * result + (areaName != null ? areaName.hashCode() : 0); result = 31 * result + (consignee != null ? consignee.hashCode() : 0); result = 31 * result + (couponDiscount != null ? couponDiscount.hashCode() : 0); result = 31 * result + exchangePoint; result = 31 * result + (expire != null ? expire.hashCode() : 0); result = 31 * result + (fee != null ? fee.hashCode() : 0); result = 31 * result + (freight != null ? freight.hashCode() : 0); result = 31 * result + (invoiceTitle != null ? invoiceTitle.hashCode() : 0); result = 31 * result + (isAllocatedStock ? 1 : 0); result = 31 * result + (isInvoice ? 1 : 0); result = 31 * result + (lockExpire != null ? lockExpire.hashCode() : 0); result = 31 * result + (memo != null ? memo.hashCode() : 0); result = 31 * result + (name != null ? name.hashCode() : 0); result = 31 * result + (offsetAmount != null ? offsetAmount.hashCode() : 0); result = 31 * result + orderStatus; result = 31 * result + (paymentMethodName != null ? paymentMethodName.hashCode() : 0); result = 31 * result + paymentStatus; result = 31 * result + (phone != null ? phone.hashCode() : 0); result = 31 * result + (promotionDiscount != null ? promotionDiscount.hashCode() : 0); result = 31 * result + (promotionName != null ? promotionName.hashCode() : 0); result = 31 * result + rewardPoint; result = 31 * result + (shippingMethodName != null ? shippingMethodName.hashCode() : 0); result = 31 * result + shippingStatus; result = 31 * result + (sn != null ? sn.hashCode() : 0); result = 31 * result + (tax != null ? tax.hashCode() : 0); result = 31 * result + type; result = 31 * result + (zipCode != null ? zipCode.hashCode() : 0); result = 31 * result + (memberorderno != null ? memberorderno.hashCode() : 0); result = 31 * result + (ordertype != null ? ordertype.hashCode() : 0); result = 31 * result + (distributeState != null ? distributeState.hashCode() : 0); result = 31 * result + (ctime != null ? ctime.hashCode() : 0); result = 31 * result + (guid != null ? guid.hashCode() : 0); result = 31 * result + (cbqrr != null ? cbqrr.hashCode() : 0); result = 31 * result + (cbqrTime != null ? cbqrTime.hashCode() : 0); result = 31 * result + (isCbqr != null ? isCbqr.hashCode() : 0); result = 31 * result + (isSrqr != null ? isSrqr.hashCode() : 0); result = 31 * result + (srqrr != null ? srqrr.hashCode() : 0); result = 31 * result + (srqrTime != null ? srqrTime.hashCode() : 0); result = 31 * result + (isShow != null ? isShow.hashCode() : 0); result = 31 * result + (isHunantb != null ? isHunantb.hashCode() : 0); result = 31 * result + (byCreditCard != null ? byCreditCard.hashCode() : 0); return result; } @ManyToOne @JoinColumn(name = "member", referencedColumnName = "id", nullable = false) public XxMember getXxMemberByMember() { return xxMemberByMember; } public void setXxMemberByMember(XxMember xxMemberByMember) { this.xxMemberByMember = xxMemberByMember; } @ManyToOne @JoinColumn(name = "operator", referencedColumnName = "id") public XxAdmin getXxAdminByOperator() { return xxAdminByOperator; } public void setXxAdminByOperator(XxAdmin xxAdminByOperator) { this.xxAdminByOperator = xxAdminByOperator; } @ManyToOne @JoinColumn(name = "admin", referencedColumnName = "id") public XxAdmin getXxAdminByAdmin() { return xxAdminByAdmin; } public void setXxAdminByAdmin(XxAdmin xxAdminByAdmin) { this.xxAdminByAdmin = xxAdminByAdmin; } } View Code OrderRepository.java package com.agen.myagen.repository; import com.agen.myagen.entity.XxAdmin; import com.agen.myagen.entity.XxOrder; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface OrderRepository extends JpaRepository<XxOrder,Integer> { List<XxOrder> findTop10ByXxAdminByOperator(XxAdmin xxAdminByOperator); @Override XxOrder findOne(Integer integer); } View Code Member.java package com.agen.orderdiscount.entity; import lombok.*; import lombok.experimental.Accessors; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; @Data(staticConstructor = "of") @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @Entity @GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator" ) public class Member { @Id @GeneratedValue(generator = "uuid2") private String memberId; @Column(nullable = false) @NonNull private Integer memberGrade; @Column(nullable = false) @NonNull private String orderSn; } View Code MemberRepositpry.java package com.agen.orderdiscount.repository; import com.agen.orderdiscount.entity.Member; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface MemberRepository extends JpaRepository<Member,String>{ @Override Member save(Member member); List<Member> findByMemberGrade(Integer memberGrade); } View Code 1.我这里myagen数据源下数据库中表早已存在,是根据hibernate反转工具生成的几个需要的类 【hibernate反转工具怎么使用】 【idea下的实体生成反转工具:http://www.cnblogs.com/sxdcgaq8080/p/7978334.html】 【myecplise下的实体生成反转工具:http://www.cnblogs.com/sxdcgaq8080/p/5593591.html】 2.和数据库打交道的持久化框架是spring boot自带的spring-data-jpa。 【spring-data-jpa怎么使用】 【入门使用:http://www.cnblogs.com/sxdcgaq8080/p/7890571.html】 【复杂使用:http://www.cnblogs.com/sxdcgaq8080/p/7894828.html】 3.Member实体中使用了lombok,一个java的一个奇技淫巧 【lombok的详解和使用:http://www.cnblogs.com/sxdcgaq8080/p/7884477.html】 4.关于Member.java实体,因为这个对应的是orderdiscount数据源,也就是主数据源,是mysql这边的,是先写了实体之后,自动根据第三步中设置在map中的 hibernate.physical_naming_strategy ,所以生成的数据表中的字段,应该是不带下划线的。 【关于hibernate的命名规则,设置参考:http://www.cnblogs.com/sxdcgaq8080/p/7910474.html】 ========================================================================================================================================= 5》最后再controller层,依次调用各种数据源对应的各个包下的各种repository操作进行操作 这一层,什么也不用多说了 MainController.java package com.agen.controller; import com.agen.myagen.entity.XxAdmin; import com.agen.myagen.entity.XxOrder; import com.agen.myagen.repository.OrderRepository; import com.agen.orderdiscount.entity.Member; import com.agen.orderdiscount.repository.MemberRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; import java.util.Objects; import java.util.UUID; @Controller public class MainController { @Autowired private OrderRepository orderRepository; @Autowired private MemberRepository memberRepository; @RequestMapping("lo") public void getOrder(){ XxOrder xxOrder = orderRepository.findOne(1510); System.out.println("sql server数据库查到order编号:"+xxOrder.getSn()); Member member = new Member(); member.setMemberId(UUID.randomUUID().toString()); member.setMemberGrade(2); member.setOrderSn(xxOrder.getSn()); Member member1 = memberRepository.save(member); if(Objects.nonNull(member1)){ System.out.println("mysql数据库插入member成功"); List<Member> list = memberRepository.findByMemberGrade(2); if(Objects.nonNull(list) && list.size() > 0){ list.forEach(i->{ System.out.println("mysql数据库查出order编号:"+i.getOrderSn()); }); } } } } View Code 然后启动,启动可以看到下面这些信息: 最后,访问一下这个地址: 可以看到和多数据源交互的 SQL语句打印出来: ====================================================================================================== 好了 ,终于完成了!!!!
参考如下: RDBMS Dialect DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect DB2 OS390 org.hibernate.dialect.DB2390Dialect PostgreSQL org.hibernate.dialect.PostgreSQLDialect MySQL5 org.hibernate.dialect.MySQL5Dialect MySQL5 with InnoDB org.hibernate.dialect.MySQL5InnoDBDialect MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect Oracle(any version) org.hibernate.dialect.OracleDialect Oracle 9i org.hibernate.dialect.Oracle9iDialect Oracle 10g org.hibernate.dialect.Oracle10gDialect Oracle 11g org.hibernate.dialect.Oracle10gDialect Sybase org.hibernate.dialect.SybaseASE15Dialect Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect Microsoft SQL Server 2000 org.hibernate.dialect.SQLServerDialect Microsoft SQL Server 2005 org.hibernate.dialect.SQLServer2005Dialect Microsoft SQL Server 2008 org.hibernate.dialect.SQLServer2008Dialect SAP DB org.hibernate.dialect.SAPDBDialect Informix org.hibernate.dialect.InformixDialect HypersonicSQL org.hibernate.dialect.HSQLDialect H2 Database org.hibernate.dialect.H2Dialect Ingres org.hibernate.dialect.IngresDialect Progress org.hibernate.dialect.ProgressDialect Mckoi SQL org.hibernate.dialect.MckoiDialect Interbase org.hibernate.dialect.InterbaseDialect Pointbase org.hibernate.dialect.PointbaseDialect FrontBase org.hibernate.dialect.FrontbaseDialect Firebird org.hibernate.dialect.FirebirdDialect
安装Idea的教程:http://www.cnblogs.com/sxdcgaq8080/p/7641379.html 搭建maven私服的教程:http://www.cnblogs.com/sxdcgaq8080/p/7583767.html 最后所有都弄完了的话,直接启动idea,然后在左上角的file中打开setting, 搜索maven, 在Use settings file:中 勾选override 然后就可以把本地的maven私服的setting.xml文件选择上 下面的Local resposity会自动识别出来。 最后apply,应用并关闭就可以了。
Spring AOP的基础概念 ============================================================= AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与 OOP 不同的抽象软件结构的视角.在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是 Aspect(切面)。 ============================================================== 基础概念图: 有了上面这张原理图,那么关于AOP面向切面编程的核心几个概念,就可以顺利铺开了: 1》join point【连接点】 在spring aop中,认为原有代码中所有的方法都是join point。 2》point cut【切点】 在不改变原有代码的情况下,想多干点事情,那就需要定义point cut,切点。切点的任务是通过一组表达式来匹配要在哪个join point切入,并且匹配要在这个join point的什么位置切入。 3》advice【增强逻辑】 根据1,2切入了原有代码后,要做些什么事情?这多做的事情就是advice,也就是多处理的一些逻辑。比如,你的原有方法是对数据的保存方法,项目交付后,新需求是需要将这些保存操作在日志中记录下来,并且不能更改原有代码,这就是增强逻辑。 advice增强逻辑你是准备放在原有代码之前还是之后,有以下几种: before advice, 在 join point 前被执行的 advice. 虽然 before advice 是在 join point 前被执行, 但是它并不能够阻止 join point 的执行, 除非发生了异常(即我们在 before advice 代码中, 不能人为地决定是否继续执行 join point 中的代码) after return advice, 在一个 join point 正常返回后执行的 advice after throwing advice, 当一个 join point 抛出异常后执行的 advice after(final) advice, 无论一个 join point 是正常退出还是发生了异常, 都会被执行的 advice. around advice, 在 join point 前和 joint point 退出后都执行的 advice. 这个是最常用的 advice. 4》weaving【织入】 现在有了原有代码,有了新的增强逻辑。将这两部分代码连接在一起的过程,就是织入weaving。 根据不同的实现技术, AOP织入有三种方式: 编译器织入, 这要求有特殊的Java编译器. 类装载期织入, 这需要有特殊的类装载器. 动态代理织入, 在运行期为目标类添加增强(Advice)生成子类的方式.Spring 采用动态代理织入, 而AspectJ采用编译器织入和类装载期织入. 5》Target【目标对象】 原有代码和增强逻辑织入在一起,重新生成的就是目标对象Target,也叫adviced object. Spring Aop使用运行时代理的方式实现Aspect,因此adviced object是一个代理对象。 【在 Spring AOP 中, 一个 AOP 代理是一个 JDK 动态代理对象或 CGLIB 代理对象。】 注意, adviced object 指的不是原来的类, 而是织入 advice 后所产生的代理类. 【关于java中代理的概念,类型,区别和理解: https://www.cnblogs.com/hongcong/p/5806024.html https://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html 可以去看上面两篇文章,我自己还没有心思去研究。 但我记住了一句话:CGLIB方式不能代理final类。也就是说Spring AOP的切口不能切在final类上了。 】 6》aspect【切面】 aspect切面,是由point cut和advice组合而成的。既包含了连接点也就是切点的定义,也有增强逻辑的具体实现。 =========================================== 到这里,一个概念就顺利的出来了:Spring AOP就是负责实施切面的框架, 它将切面所定义的横切逻辑织入到切面所指定的连接点中. =========================================== Spring Aop的实现和使用的各种情况 ======================================================= 要在Spring中通过注解方式使用AOP,需要下面两步: 1》在配置文件中配置 <!-- 自动扫描注解 --> <context:component-scan base-package="com.sxd" /> <!--Spring aop 使用注解的方式--> <aop:aspectj-autoproxy /> 2》定义切面【aspect】 切面包括 切点【point cut】 和 增强逻辑【advice】 【下面aspect中已经显示了point cut的各种定义表达式 和 各种类的advice】 【具体使用,应该按照实际使用逻辑选择性使用即可!!!】 package com.sxd.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; import java.util.Objects; /** * 切面定义 * ①在类上定义@Aspect和@Component * ②@Pointcut()定义切点 * ③adive方法上,声明在哪一个切点上切入 加入增强逻辑 */ @Aspect @Component public class Aspects { /** * execution() 表达式:用来匹配执行方法的连接点 * 【..(两个点)代表零个或多个】 * 【本例子中 第一个*代表方法的返回值类型可以为任何类型 如果本方法为void,也符合切入条件】 * 【本例子中 第一个..代表controller包以及子包下】 * 【本例子中 第二个*代表这个包下的任意类】 * 【本例子中 第三个*代表这个包下的任意类中的任意方法】 * 【本例子中 第二个..代表有无参数都可以被切入】 * * args 如果想要切入的方法的参数要符合什么类型的话 * 【本例子代表入参中,第一个参数类型需要为String类型的才会被切入,之后有零个入参或多个入参】 * */ @Pointcut(value = "execution(* com.sxd.controller..*.*(..)) && args(String,..)") public void pointCut1(){} /** * within() 表达式用于匹配这个包下的任意类 */ @Pointcut(value = "within(com.sxd.controller.*)") public void pointCut2(){} /** * this() 表达式限定了匹配这个类的实例下的方法 */ @Pointcut(value = "this(com.sxd.controller.MainController)") public void pointCut3(){} /** * bean() 匹配IOC容器中的bean的名称 */ @Pointcut(value = "bean(memberService)") public void pointCut4(){} /** * 下面是各种advice的展示 * * 1》advice的执行优先级: around方法执行前》before》【方法自己】》around方法执行后》after》afterReturning * 2》若有异常 * advice的执行优先级:around方法执行前》before》【方法自己】》around方法执行后》after》afterReturning * 很奇怪为什么两次都是一样的执行优先级,为什么没有进afterThrowing().因为使用了around。 * 3》注意:Spring AOP的环绕通知会影响到AfterThrowing通知的运行,不要同时使用! * * 4》注意:在切面的advice里面,一定不要让异常抛出去,影响原方法的执行和返回。 * 5》JoinPoint 即原方法的入参 * 6》returning即原方法的返回值 * 7》如果原方法没有返回值,而这里的advice定义了returning,即使pointCut可以匹配上切点,也不会切入原方法 */ @Before("pointCut1()") public void justBefore(JoinPoint joinPoint){ System.out.println("切入方法前"); } @After("pointCut1()") public void justAfter(JoinPoint joinPoint){ Object[] arr = joinPoint.getArgs(); if(Objects.nonNull(arr) && arr.length >0){ System.out.println((String)arr[0]); System.out.println((Integer)arr[1]); } System.out.println("切入方法后"); } @AfterReturning(pointcut = "pointCut1()",returning = "returnVal") public void justAfterReturn(JoinPoint joinPoint,Object returnVal){ System.out.println(returnVal.toString()); System.out.println("在方法执行完,并未抛异常,能正确返回值的情况下,在返回值之前切入"); } @AfterThrowing(pointcut = "pointCut1()",throwing = "err") public void justAfterThrow(JoinPoint joinPoint,Throwable err){ System.out.println("在方法执行,抛异常的情况下,切入"); } @Around("pointCut1()") public Object justAround(ProceedingJoinPoint proceedingJoinPoint){ System.out.println("环绕型切入,方法执行前"); Object a = null; try { a = proceedingJoinPoint.proceed(); } catch (Throwable throwable) { throwable.printStackTrace(); } System.out.println("环绕型切入,方法执行后"); return a; } } 3》上面两步 就把aop写完了 ,最后要测试一下各种情况 package com.sxd.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MainController { @ResponseBody @RequestMapping("do") public String doSomething(){ return "无参"; } @ResponseBody @RequestMapping("do2") public String doSomething2(String a){ return "有参"+a; } @ResponseBody @RequestMapping("do3") public String doSomething3(Integer a,String b){ return "整数"+a+"---字符串"+b; } @ResponseBody @RequestMapping("do4") public String doSomething4(String a,Integer b){ return "字符串"+a+"---整数"+b; } @ResponseBody @RequestMapping("do5") public String doSomething5(String a,Integer b) throws Throwable{ return "字符串转成数字"+Integer.parseInt(a)+"---整数"+b; } @ResponseBody @RequestMapping("do6") public void doSomething6(){ System.out.println("无返回值的"); } } View Code 发请求 测试即可。
晚上上床前,拿到这个有意思的问题,就想玩弄一番: ============================================================================ 规则:【随机浮点数按照RMB读法写出】 总代码如下: package com.sxd.test; import org.junit.Test; import java.text.DecimalFormat; import java.util.Random; /** * @Author SXD */ public class RandomTest { @Test public void createRandom(){ DecimalFormat df = new DecimalFormat("0.00"); Random random = new Random(); double aa = (random.nextDouble())*(random.nextInt(Integer.MAX_VALUE)); System.out.println(df.format(aa)); System.out.println(deal4RMB(df.format(aa))); } /** * 从小数点为分界线,往前迭代处理+往后拼接角分+部分规则 * @param dbNum 随机浮点数值 * @return 转化后的RMB大写数值描述 */ private String deal4RMB(String dbNum){ String sb = ""; try { int point = dbNum.lastIndexOf("."); char [] charArr = dbNum.toCharArray(); for (int i = 1; i <= point; i++) { String flag = getUpperCase(charArr[point-i],i); sb = flag + sb ; if("error".equals(flag)){ return "转化异常"; } } sb = dealString(sb); sb = sb+"元"+getUpperCase(charArr[point+1],-1)+getUpperCase(charArr[point+2],-2); }catch (Exception e){ System.out.println(e); return "转化异常"; } return sb; } /** * 替换中文RMB计数 + 部分规则 * @param a 数值 * @param i 位置 * @return 数值+位置 */ private String getUpperCase(char a,int i){ //本位值为0 并且 本位位置在个位 小数点后一位 小数点后两位 //不做任何返回操作 if('0' == a && (i==1 || i==-1 || i==-2)){ return ""; } //本位值为0 并且 本位位置在万位 //仅返回 万 而不是几万 if ('0' == a && i==5) { return "万"; } //本位数字转化的汉字大写数字 String flag = ""; //本位位置对应 【分 角 个 十 百 千 万 亿】 String flag2 = ""; switch (a){ case '0' : flag = "零";break; case '1' : flag = "壹";break; case '2' : flag = "贰";break; case '3' : flag = "叁";break; case '4' : flag = "肆";break; case '5' : flag = "伍";break; case '6' : flag = "陆";break; case '7' : flag = "柒";break; case '8' : flag = "捌";break; case '9' : flag = "玖";break; default : flag = "error"; } //本位为零 不拼接本位位置 【除万位 上方已经单独处理】 if(!"零".equals(flag)){ switch (i){ case -1: flag2 = "角";break; case -2: flag2 = "分";break; case 2: case 6: case 10: flag2 = "十";break; case 3: case 7: case 11: flag2 = "百";break; case 4: case 8: flag2 = "千";break; case 5: flag2 = "万";break; case 9: flag2 = "亿";break; default: flag2 = ""; } } /** * 本处处理未完善 *因为随机数 Integer位数达到10位以上的概率很大 *因此处理时仅处理了 壹十贰亿几千几百万 这种情况 *若随机数级别在十万位 依旧会出现 壹十几万几千几百 *若随机数级别在十位 依旧会出现 壹十几点几情况 * * 若要完全处理,仅需要先判断随机数总位数,而后再判断i的值为第几位再特殊处理即可~~ */ if("壹".equals(flag) && "十".equals(flag2) && i == 10){ return flag2; } //返回 数值+位置 return flag+flag2; } /** * 去除重复零 + 部分规则 * @param rmbStr * @return */ private String dealString(String rmbStr){ while(rmbStr.indexOf("零零") >= 0){ rmbStr = rmbStr.replace("零零","零"); } //判断个位是否依旧为零 若为零 截取字符串即可 char [] arr = rmbStr.toCharArray(); if('零' == arr[arr.length-1]){ rmbStr = rmbStr.substring(0,rmbStr.length()-1); } return rmbStr; } } View Code 效果展示:
AOP来发过程中,报错如下: warning no match for this type name: net.shopxx.wx.institution.controller [Xlint:invalidAbsoluteTypeName] 原因:
ActiveMQ版本:5.12 JDK版本:1.8 ===================== 使用ActiveMQ过程中,在管理界面查看消息详情,发现报错: 查看日志信息,报错如下: 2017-11-29 16:29:08,020 | WARN | /admin/message.jsp | org.eclipse.jetty.servlet.ServletHandler | qtp68389885-53 org.apache.jasper.JasperException: PWC6033: Unable to compile class for JSP PWC6197: An error occurred at line: 20 in the jsp file: /WEB-INF/tags/form/forEachMapEntry.tag PWC6199: Generated servlet error: The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:123)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:296)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:376)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Compiler.compile(Compiler.java:437)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:608)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.servlet.JspServletWrapper.loadTagFile(JspServletWrapper.java:261)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.TagFileProcessor.loadTagFile(TagFileProcessor.java:683)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.TagFileProcessor.access$000(TagFileProcessor.java:88)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:739)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1501)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2341)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:743)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1501)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2341)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:743)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1501)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2341)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2347)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Root.accept(Node.java:498)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.TagFileProcessor.loadTagFiles(TagFileProcessor.java:757)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:222)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Compiler.compile(Compiler.java:435)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:608)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:360)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:486)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:380)[jsp-2.1-glassfish-2.1.v20100127.jar:] at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)[geronimo-servlet_3.0_spec-1.0.jar:1.0] at org.eclipse.jetty.servlet.JspPropertyGroupServlet.service(JspPropertyGroupServlet.java:132)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)[spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)[spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1484)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] at org.apache.activemq.web.SessionFilter.doFilter(SessionFilter.java:45)[activemq-web-5.12.1.jar:5.12.1] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1484)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] at org.apache.activemq.web.filter.ApplicationContextFilter.doFilter(ApplicationContextFilter.java:102)[file:/D:/apps/apache-activemq-5.12.1/webapps/admin/WEB-INF/classes/:] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] View Code 原因: 因为ActiveMQ5.12在这里不支持JDK1.8的原因,导致出现上述问题!! 解决方法: 我去官方下载了ActiveMQ 5.15 ,然后5.15和JDK1.8没有这个问题!!!【我不想将JDK1.8换成1.7,所以就把ActiveMQ的版本进行更替】
ActiveMQ版本:5.12 JDK版本:1.8 ===================== 使用ActiveMQ过程中,在管理界面查看消息详情,发现报错: 查看日志信息,报错如下: 2017-11-29 16:29:08,020 | WARN | /admin/message.jsp | org.eclipse.jetty.servlet.ServletHandler | qtp68389885-53 org.apache.jasper.JasperException: PWC6033: Unable to compile class for JSP PWC6197: An error occurred at line: 20 in the jsp file: /WEB-INF/tags/form/forEachMapEntry.tag PWC6199: Generated servlet error: The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:123)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:296)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:376)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Compiler.compile(Compiler.java:437)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:608)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.servlet.JspServletWrapper.loadTagFile(JspServletWrapper.java:261)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.TagFileProcessor.loadTagFile(TagFileProcessor.java:683)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.TagFileProcessor.access$000(TagFileProcessor.java:88)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:739)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1501)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2341)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:743)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1501)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2341)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:743)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1501)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2341)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2347)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Root.accept(Node.java:498)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.TagFileProcessor.loadTagFiles(TagFileProcessor.java:757)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:222)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.compiler.Compiler.compile(Compiler.java:435)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:608)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:360)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:486)[jsp-2.1-glassfish-2.1.v20100127.jar:] at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:380)[jsp-2.1-glassfish-2.1.v20100127.jar:] at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)[geronimo-servlet_3.0_spec-1.0.jar:1.0] at org.eclipse.jetty.servlet.JspPropertyGroupServlet.service(JspPropertyGroupServlet.java:132)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)[spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)[spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1484)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] at org.apache.activemq.web.SessionFilter.doFilter(SessionFilter.java:45)[activemq-web-5.12.1.jar:5.12.1] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1484)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] at org.apache.activemq.web.filter.ApplicationContextFilter.doFilter(ApplicationContextFilter.java:102)[file:/D:/apps/apache-activemq-5.12.1/webapps/admin/WEB-INF/classes/:] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)[jetty-all-8.1.16.v20140903.jar:8.1.16.v20140903] View Code 原因: 因为ActiveMQ5.12在这里不支持JDK1.8的原因,导致出现上述问题!! 解决方法: 我去官方下载了ActiveMQ 5.15 ,然后5.15和JDK1.8没有这个问题!!!【我不想将JDK1.8换成1.7,所以就把ActiveMQ的版本进行更替】
使用ActiveMQ过程中,定义消息生产者: package com.sxd.jms.producer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Service; import javax.jms.Destination; @Service("producer") public class Producer1 { @Autowired // 也可以注入JmsTemplate,JmsMessagingTemplate对JmsTemplate进行了封装 private JmsMessagingTemplate jmsTemplate; // 发送消息,destination是发送到的队列,message是待发送的消息 public void sendMessage(Destination destination, final String message){ jmsTemplate.convertAndSend(destination, message); } } View Code 但是IDE报错: 启动编译,依旧是报错: Description: Field jmsTemplate in com.sxd.jms.producer.Producer1 required a bean of type 'org.springframework.jms.core.JmsMessagingTemplate' that could not be found. - Bean method 'jmsMessagingTemplate' not loaded because Ancestor org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration did not match Action: Consider revisiting the conditions above or defining a bean of type 'org.springframework.jms.core.JmsMessagingTemplate' in your configuration. 解决方式: 因为application.properties中配置ActiveMQ的相关配置后面有空格: 把配置后面的空格去掉。保存,重新编译。 解决了!!!!
官网下载:http://activemq.apache.org/activemq-5121-release.html 官网指导文档:http://activemq.apache.org/version-5-getting-started.html 《windows下安装使用版本Apache ActiveMQ 5.12.1》 ======================================================================================================================== 安装启动ActiveMQ 1。根据上面官网地址,下载【请大家下载较新的版本,这样好多后续的BUG就能避免了】 2.解压到本地: 3.启动: 【有个小坑,你应该找到bin目录下的对应64位或32位目录下的activemq.bat启动黑窗口】 4.访问: 【http://localhost:8161/admin/】帐号密码:admin ================================================================================================================================================================================ 在spring项目中使用ActiveMQ 【搭建spring项目http://www.cnblogs.com/sxdcgaq8080/p/7979506.html】 1.pom.xml文件引入架包 你可以添加完整的依赖,pom.xml 添加依赖: <!--ActiveMQ--> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.12.1</version> </dependency> 当然,也可以根据实际的环境,引入部分需要的依赖即可,添加部分依赖!! 这里我选用版本如下: spring 版本4.3.13 activeMQ版本5.15 完整的pom.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sxd</groupId> <artifactId>springDemo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>4.3.13.RELEASE</spring.version> <hibernate.version>4.3.8.Final</hibernate.version> <jackson.version>2.5.0</jackson.version> </properties> <dependencies> <!--ActiveMQ--> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-core</artifactId> <version>5.7.0</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> <version>5.12.1</version> </dependency> <dependency> <groupId>org.apache.xbean</groupId> <artifactId>xbean-spring</artifactId> <version>4.6</version> </dependency> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <!-- 使用SpringMVC需配置 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- spring cglib 代理 --> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency> <!-- 关系型数据库整合时需配置 如hibernate jpa等 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <!-- hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>${hibernate.version}</version> </dependency> <!-- 二级缓存ehcache --> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.9.0</version> </dependency> <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- mysql连接 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <!-- c3p0数据源 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5-pre10</version> </dependency> <!-- json --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- aop --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.4</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0-alpha-1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> </project> View Code 【关于spring整合avticeMQ的过程中,产生的各种架包冲突】 【http://www.cnblogs.com/sxdcgaq8080/p/8023726.html】 【http://www.cnblogs.com/sxdcgaq8080/p/8022121.html】 【http://www.cnblogs.com/sxdcgaq8080/p/8005886.html】 2.搭建spring项目的流程和配置文件 参考:http://www.cnblogs.com/sxdcgaq8080/p/7979506.html 3.在第二步基础上,添加avticeMQ的配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amq="http://activemq.apache.org/schema/core" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.12.1.xsd" > <amq:connectionFactory id="amqConnectionFactory" brokerURL="tcp://localhost:61616" userName="admin" password="admin" /> <!-- 配置JMS连接工厂 --> <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> <constructor-arg ref="amqConnectionFactory" /> <property name="sessionCacheSize" value="100" /> </bean> <!-- 定义消息队列(Queue) --> <bean id="destinationEx" class="org.apache.activemq.command.ActiveMQQueue"> <!-- 设置消息队列的名字 名字就是order.queue--> <constructor-arg> <value>jms.queue</value> </constructor-arg> </bean> <!-- 配置JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息。 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory" /> <property name="defaultDestination" ref="destinationEx" /> <property name="receiveTimeout" value="10000" /> <!-- true是topic,false是queue,默认是false,此处显示写出false --> <property name="pubSubDomain" value="false" /> </bean> <!-- 配置消息队列监听者(Queue) <bean id="queueMessageListener" class="com.sxd.jms.QueueMessageListener" /> 显示注入消息监听容器(Queue),配置连接工厂,监听的目标是demoQueueDestination,监听器是上面定义的监听器 <bean id="queueListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory" /> <property name="destination" ref="destinationEx" /> <property name="messageListener" ref="queueMessageListener" /> </bean> --> </beans> View Code 【这一部分,先不看监听器的使用,所以先注掉】 4.web,xml文件读取spring-ActiveMQ.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!-- web容器是web项目的大脑 --> <!-- 在web.xml中,执行顺序是:1.先执行listener 2。再执行filter 3.最后执行servlet 这就是执行顺序 就像spring-hibernate.xml文件是在执行Listener的时候加载的,那注意这几个配置文件在web.xml中的加载顺序,因为资源文件是在配置文件【xml文件】中加载的,肯定是先加载的资源文件【properties文件】,才能在配置文件中调用资源文件中的变量的值使用 --> <display-name>springDemo</display-name> <!-- web容器,首先需要引入spring,让spring管理各个框架,并将其注入为bean --> <!-- 这个相当于定一个 变量在web.xml中,在下面的listener org.springframework.web.context.ContextLoaderListener中,加载这个spring-hibernate.xml文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-hibernate.xml, classpath:spring-ActiveMQ.xml </param-value> </context-param> <!-- 配置控制层的filter信息 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- openSessionInView配置 作用是延迟session关闭到view层 --> <filter> <filter-name>openSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>singleSession</param-name> <param-value>true</param-value> </init-param> </filter> <!-- 监听servletContext,启动contextConfigLocation中的spring配置信息 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 类似与servlet 需要在web.xml中都需要配置一样,spring的思想是让这些servlet【controller也是servlet】继承了一个基础的servlet,那就只需在web.xml中配置一个servlet即可。 --> <!-- 这个servlet和下面的servlet-mapping相配合使用,注明了所有的以.htmls结尾的请求都被截取到,去到servlet中去找相对应的方法 进行处理 --> <servlet> <description>spring mvc servlet</description> <servlet-name>rest</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!-- 此处配置的是SpringMVC的配置文件 --> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- 配置了springmvc拦截的url为以.hmls结尾的请求 --> <servlet-mapping> <servlet-name>rest</servlet-name> <url-pattern>*.htmls</url-pattern> </servlet-mapping> <filter-mapping> <filter-name>openSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 配置session超时时间,单位分钟 --> <session-config> <session-timeout>30</session-timeout> </session-config> <!-- 欢迎界面 默认的项目访问界面 --> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> </web-app> View Code 5.消息生产者Producter.java package com.sxd.jms; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.MessageCreator; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; @Service public class Producter { @Resource(name = "jmsTemplate") private JmsTemplate jmsTemplate; public void sendMessage(Destination destination, final String msg){ System.out.println(Thread.currentThread().getName()+" 向队列"+destination.toString()+"发送消息---------------------->"+msg); jmsTemplate.send(destination, new MessageCreator() { public Message createMessage(Session session) throws JMSException { return session.createTextMessage(msg); } }); } public void sendMessage(final String msg){ String destination = jmsTemplate.getDefaultDestinationName(); System.out.println(Thread.currentThread().getName()+" 向队列"+destination+"发送消息---------------------->"+msg); jmsTemplate.send(new MessageCreator() { public Message createMessage(Session session) throws JMSException { return session.createTextMessage(msg); } }); } } View Code 6.消息消费者Consumer.java package com.sxd.jms; import org.springframework.jms.core.JmsTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.TextMessage; @Service public class Consumer { @Resource(name="jmsTemplate") private JmsTemplate jmsTemplate; public String receive(Destination destination){ TextMessage textMessage = (TextMessage) jmsTemplate.receive(destination); try{ System.out.println("从队列" + destination.toString() + "收到了消息:\t" + textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } return textMessage.toString(); } } View Code 7.控制器中send()方法是往MQ发送消息,get()方法是从MQ接收消息MainController.java package com.sxd.controller; import com.sxd.jms.Consumer; import com.sxd.jms.Producter; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import javax.jms.Destination; @Controller public class MainController { @Resource(name = "producter") private Producter producter; @Resource(name = "consumer") private Consumer consumer; @Resource(name = "destinationEx") private Destination destination; @ResponseBody @RequestMapping("do") public String doMain(){ return "启动成功"; } @ResponseBody @RequestMapping("send") public String doSomething(){ producter.sendMessage(destination,"Panama"); return "Just for what"; } @ResponseBody @RequestMapping("get") public String getSomething(){ String str = consumer.receive(destination); return "MQ取出来消息"+str; } } View Code 8.启动服务,浏览器访问 1》消息生产者往MQ中存入一条消息 查看MQ管理页面 2》消息消费者从MQ中获取消息 ============================================================================================================================================ 设置消息监听器,自动监听MQ队列中的消息并处理 上面 MQ中的消息,是自己去MQ队列中取出来的。 如果自动的让它只要有消息了就处理的话,需要上面的监听器完善一下 QueueMessageListener.java package com.sxd.jms; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; /** * 消息监听器 */ public class QueueMessageListener implements MessageListener{ public void onMessage(Message message) { TextMessage msg = (TextMessage) message; try{ System.out.println("消息监听器监听到的消息:"+msg); }catch (Exception e){ System.out.println(e); } } } View Code 然后把spring-ActiveMQ.xml中监听器放开 <!-- 配置消息队列监听者(Queue)--> <bean id="queueMessageListener" class="com.sxd.jms.QueueMessageListener" /> <!--显式注入消息监听容器(Queue),配置连接工厂,监听的目标是demoQueueDestination,监听器是上面定义的监听器--> <bean id="queueListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory" /> <property name="destination" ref="destinationEx" /> <property name="messageListener" ref="queueMessageListener" /> </bean> View Code 重启后,开始往队列中放入消息: 消息监听器自动处理了Queue中的消息!!! =============================================================================================== 完了哦!!
===================================================hibernate 4命名策略如下================================================= spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.DefaultNamingStrategy 有两种值可以配置分别为: 第一:org.hibernate.cfg.DefaultNamingStrategy 第二:org.hibernate.cfg.ImprovedNamingStrategy DefaultNamingStrategy这个直接映射,不会做过多的处理(前提没有设置@Table,@Column等属性的时候)。如果有@Column则以@Column为准 ImprovedNamingStrategy 表名,字段为小写,当有大写字母的时候会转换为分隔符号“_”。 参考地址:http://blog.csdn.net/linxingliang/article/details/52566896 ===================================================hibernate 5 命名策略============================================ 首先明确,上面的是hibernate4实体映射到数据表时候的命名策略。 在hibernate5之后,上面的作废。而是采用下面两个属性: spring.jpa.hibernate.naming.implicit-strategy= # Hibernate 5 implicit naming strategy fully qualified name. spring.jpa.hibernate.naming.physical-strategy= # Hibernate 5 physical naming strategy fully qualified name. 好了,分来开说,这两个属性分别怎么使用》》》》》 》》首先是physical-strategy: spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 它有两个值分别可以配置: 第一:org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 第二:org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy 效果分别如下: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl效果等同于: hibernate4中的DefaultNamingStrategy这个直接映射,不会做过多的处理(前提没有设置@Table,@Column等属性的时候)。如果有@Column则以@Column为准 【我采用这个命名策略】【多一句:对于关联关系的依旧会命名为user_id这种样子,看下图】 org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy效果等同于: hibernate4中的ImprovedNamingStrategy 表名,字段为小写,当有大写字母的时候会转换为分隔符号“_”。 》》接下来说implicit-strategy的使用情况: spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl 它有如下的值可以配置: 第一:org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImp 第二:org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl第三:org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl 效果分别如下: ==================================================== JPA2.0兼容的命名策略【默认】 spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl ============================================================== 原始的Hibernate NamingStrategy【注意外键关联字段】 spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl ======================================================== 遵循ImplicitNamingStrategyJpaCompliantImpl规则 spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl
对于 spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy hibernate命名策略设置之后不起作用的处理方式:http://www.cnblogs.com/sxdcgaq8080/p/7890218.html,查看1.JPA hibernate命名策略即可 现在这里说一下原因,为什么不起作用: spring.jpa.hibernate.naming-strategy 设置命名策略,是hibernate4的命名策略,对于hibernate5是不起作用的。 查看自己项目中hibernate版本: 完整的spring boot配置可以查看:http://www.cnblogs.com/sxdcgaq8080/p/7724506.html
这篇专门用来对spring-data-jpa的详细介绍和复杂使用做一个阐述。 参考文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/