diff --git a/luoo_comment/pom.xml b/luoo_comment/pom.xml index 998f534..f3d5cee 100644 --- a/luoo_comment/pom.xml +++ b/luoo_comment/pom.xml @@ -34,6 +34,12 @@ spring-cloud-starter-config + + cn.hutool + hutool-all + 5.8.16 + + net.renfei ip2location @@ -52,6 +58,10 @@ org.springframework.boot spring-boot-starter-actuator + + org.springframework.cloud + spring-cloud-openfeign-core + app diff --git a/luoo_comment/src/main/java/com/luoo/comment/client/UserClient.java b/luoo_comment/src/main/java/com/luoo/comment/client/UserClient.java new file mode 100644 index 0000000..8506208 --- /dev/null +++ b/luoo_comment/src/main/java/com/luoo/comment/client/UserClient.java @@ -0,0 +1,11 @@ +package com.luoo.comment.client; + + +import org.springframework.cloud.openfeign.FeignClient; + +@FeignClient("luoo-user") +public interface UserClient { + + //todo 根据用户 IDs 获取用户昵称集合 + +} diff --git a/luoo_comment/src/main/java/com/luoo/comment/config/TokenInterceptor.java b/luoo_comment/src/main/java/com/luoo/comment/config/TokenInterceptor.java new file mode 100644 index 0000000..256dd1d --- /dev/null +++ b/luoo_comment/src/main/java/com/luoo/comment/config/TokenInterceptor.java @@ -0,0 +1,58 @@ +package com.luoo.comment.config; + +import com.luoo.comment.constant.GlobalConstant; +import com.luoo.comment.pojo.LoginAuthDto; +import com.luoo.comment.utils.ThreadLocalMap; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Component +@Slf4j +public class TokenInterceptor implements HandlerInterceptor { + + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + return HandlerInterceptor.super.preHandle(request, response, handler); + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + + String token = StringUtils.substringAfter(request.getHeader(HttpHeaders.AUTHORIZATION), "Bearer "); + LoginAuthDto loginUser= decode(token); + if (loginUser == null) { + log.error("获取用户信息失败, 不允许操作,需重新登录"); + throw new RuntimeException("获取用户信息失败, 不允许操作,需重新登录"); + } + log.info("请求uri => {} method => {} user => {} userId => {} token => {}", + request.getRequestURI(), request.getMethod(), loginUser.getLoginName(), loginUser.getUserId(),token); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + ThreadLocalMap.remove(GlobalConstant.TOKEN_AUTH_DTO); + } + + /** + * 解析token + * @param token + * @return + */ + public static LoginAuthDto decode(String token){ +// Jwt decode = JwtHelper.decode(token); +// return decodeLoginUser(decode); + // 解析 token + return null; + } + + + +} diff --git a/luoo_comment/src/main/java/com/luoo/comment/constant/GlobalConstant.java b/luoo_comment/src/main/java/com/luoo/comment/constant/GlobalConstant.java new file mode 100644 index 0000000..12f2ed3 --- /dev/null +++ b/luoo_comment/src/main/java/com/luoo/comment/constant/GlobalConstant.java @@ -0,0 +1,9 @@ +package com.luoo.comment.constant; + +public class GlobalConstant { + + /** + * 全局用户名 + */ + public static final String TOKEN_AUTH_DTO = "CURRENT_USER_DTO"; +} diff --git a/luoo_comment/src/main/java/com/luoo/comment/controller/BaseController.java b/luoo_comment/src/main/java/com/luoo/comment/controller/BaseController.java new file mode 100644 index 0000000..cca3b1d --- /dev/null +++ b/luoo_comment/src/main/java/com/luoo/comment/controller/BaseController.java @@ -0,0 +1,21 @@ +package com.luoo.comment.controller; + +import cn.hutool.core.util.ObjectUtil; +import com.luoo.comment.pojo.LoginAuthDto; +import com.luoo.comment.utils.ThreadLocalMap; + +public class BaseController { + + /** + * 全局用户名 + */ + public static final String TOKEN_AUTH_DTO = "CURRENT_USER_DTO"; + + protected LoginAuthDto getLoginAuthDto() { + LoginAuthDto loginAuthDto = (LoginAuthDto) ThreadLocalMap.get(TOKEN_AUTH_DTO); + if (ObjectUtil.isEmpty(loginAuthDto)) { + throw new RuntimeException(); + } + return loginAuthDto; + } +} diff --git a/luoo_comment/src/main/java/com/luoo/comment/controller/CommentController.java b/luoo_comment/src/main/java/com/luoo/comment/controller/CommentController.java index 36f4504..e374675 100644 --- a/luoo_comment/src/main/java/com/luoo/comment/controller/CommentController.java +++ b/luoo_comment/src/main/java/com/luoo/comment/controller/CommentController.java @@ -1,23 +1,25 @@ package com.luoo.comment.controller; -import com.luoo.comment.pojo.Comment; -import com.luoo.comment.service.CommentService; import api.PageResult; import api.Result; import api.StatusCode; - -import java.util.List; - +import com.luoo.comment.pojo.Comment; +import com.luoo.comment.pojo.CommentDto; +import com.luoo.comment.pojo.CommentVo; +import com.luoo.comment.pojo.LoginAuthDto; +import com.luoo.comment.service.CommentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @CrossOrigin @RequestMapping("/comment") -public class CommentController { +public class CommentController extends BaseController{ @Autowired private CommentService commentService; @@ -25,12 +27,6 @@ public class CommentController { @Autowired private RedisTemplate redisTemplate; - @GetMapping - public Result> findAll(){ - return Result.success(commentService.findAll()); - } - - @GetMapping("/findByVolid/{volid}") public Result> findByVolid(@PathVariable String volid){ return Result.success(commentService.findByVolid(volid)); @@ -43,18 +39,11 @@ public class CommentController { } - @PostMapping - public Result save(@RequestBody Comment comment){ - commentService.save(comment); - return Result.success(); - - } - - - @PutMapping("/{commentId}") - public Result update(@PathVariable String commentId,@RequestBody Comment comment){ - comment.set_id(commentId); - commentService.update(comment); + @PostMapping("/save") + public Result save(@RequestBody CommentDto commentDto){ + LoginAuthDto loginAuthDto = getLoginAuthDto(); + commentDto.setUserId(loginAuthDto.getUserId()); + commentService.save(commentDto); return Result.success(); } @@ -63,24 +52,25 @@ public class CommentController { public Result delete(@PathVariable String commentId){ commentService.deleteById(commentId); return Result.success(); - } - @GetMapping("/{parentid}/{page}/{size}") - public Result> findByParentid(@PathVariable String parentid,@PathVariable int page,@PathVariable int size){ - - Page pageData = commentService.findByParentId(parentid,page,size); - return Result.success(new PageResult(pageData.getTotalElements(),pageData.getContent())); + @GetMapping("/findByParentId") + public Result> findByParentId(@RequestParam String parentId, + @RequestParam int page, + @RequestParam int size){ + Page pageData = commentService.findByParentId(parentId,page,size); + return Result.success(new PageResult<>(pageData.getTotalElements(),pageData.getContent())); } @PutMapping("/thumbup/{commentId}") public Result thumbup(@PathVariable String commentId){ - String userid="111"; - if (redisTemplate.opsForValue().get("thumbup_"+userid)!=null){ + LoginAuthDto loginAuthDto = getLoginAuthDto(); + String userId = loginAuthDto.getUserId(); + if (redisTemplate.opsForValue().get("thumbup_"+userId)!=null){ return Result.failed(StatusCode.COMMENT_REPEAT_SUBMIT); } commentService.thumbup(commentId); - redisTemplate.opsForValue().set("thumbup_"+userid,1); + redisTemplate.opsForValue().set("thumbup_"+userId,1); return Result.success(); } } diff --git a/luoo_comment/src/main/java/com/luoo/comment/dao/CommentDao.java b/luoo_comment/src/main/java/com/luoo/comment/dao/CommentDao.java index 49b9625..9adfced 100644 --- a/luoo_comment/src/main/java/com/luoo/comment/dao/CommentDao.java +++ b/luoo_comment/src/main/java/com/luoo/comment/dao/CommentDao.java @@ -9,8 +9,8 @@ import java.util.List; public interface CommentDao extends MongoRepository { - public Page findByParentid(String parentid, Pageable pageable); + Page findByParentId(String parentId, Pageable pageable); - public List findByArticleid(String articleid); + List findByArticleId(String articleId); } diff --git a/luoo_comment/src/main/java/com/luoo/comment/enums/CommentStatusEnum.java b/luoo_comment/src/main/java/com/luoo/comment/enums/CommentStatusEnum.java new file mode 100644 index 0000000..274389a --- /dev/null +++ b/luoo_comment/src/main/java/com/luoo/comment/enums/CommentStatusEnum.java @@ -0,0 +1,29 @@ +package com.luoo.comment.enums; + +public enum CommentStatusEnum { + + /** + * 正常 + */ + NORMAL(1), + + /** + * 删除 + */ + DELETE(2), + + /** + * 审核中 + */ + AUDITING(3); + + private final int value; + + CommentStatusEnum(int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/luoo_comment/src/main/java/com/luoo/comment/pojo/Comment.java b/luoo_comment/src/main/java/com/luoo/comment/pojo/Comment.java index 4c3b7b4..314fd22 100644 --- a/luoo_comment/src/main/java/com/luoo/comment/pojo/Comment.java +++ b/luoo_comment/src/main/java/com/luoo/comment/pojo/Comment.java @@ -1,23 +1,24 @@ package com.luoo.comment.pojo; +import lombok.Data; +import org.springframework.beans.BeanUtils; import org.springframework.data.annotation.Id; import java.io.Serializable; import java.util.Date; +@Data public class Comment implements Serializable { @Id - private String _id; + private String id; // 评论内容 private String content; // 发布时间 - private Date publishtime; - private String userid; - // 昵称 - private String nickname; - // 访问数 - private Integer visits; + private Date publishTime; + + private String userId; + // 点赞数 private Integer thumbup; // 转发数 @@ -26,105 +27,30 @@ public class Comment implements Serializable { private Integer comment; // 状态 - private String state; - - - private String parentid; - private String articleid; - - public String get_id() { - return _id; - } - - public void set_id(String _id) { - this._id = _id; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } + private Integer state; - public Date getPublishtime() { - return publishtime; - } + /** + * 父节点 ID + */ + private String parentId; - public void setPublishtime(Date publishtime) { - this.publishtime = publishtime; - } + private String articleId; - public String getUserid() { - return userid; - } + private Integer level; - public void setUserid(String userid) { - this.userid = userid; - } + private String targetId; - public String getNickname() { - return nickname; - } + /** + * 评论类型 + */ + private Integer type; - public void setNickname(String nickname) { - this.nickname = nickname; - } - - public Integer getVisits() { - return visits; - } - - public void setVisits(Integer visits) { - this.visits = visits; - } + private String city; - public Integer getThumbup() { - return thumbup; + public CommentVo convertVo () { + CommentVo commentVo = new CommentVo(); + BeanUtils.copyProperties(this, commentVo); + return commentVo; } - public void setThumbup(Integer thumbup) { - this.thumbup = thumbup; - } - - public Integer getShare() { - return share; - } - - public void setShare(Integer share) { - this.share = share; - } - - public Integer getComment() { - return comment; - } - - public void setComment(Integer comment) { - this.comment = comment; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } - - public String getParentid() { - return parentid; - } - - public void setParentid(String parentid) { - this.parentid = parentid; - } - - public String getArticleid() { - return articleid; - } - - public void setArticleid(String articleid) { - this.articleid = articleid; - } } diff --git a/luoo_comment/src/main/java/com/luoo/comment/pojo/CommentDto.java b/luoo_comment/src/main/java/com/luoo/comment/pojo/CommentDto.java new file mode 100644 index 0000000..edd315b --- /dev/null +++ b/luoo_comment/src/main/java/com/luoo/comment/pojo/CommentDto.java @@ -0,0 +1,37 @@ +package com.luoo.comment.pojo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class CommentDto implements Serializable { + + /** + * 文章 ID + */ + private String articleId; + + /** + * 评论内容 + */ + private String content; + + /** + * 父节点 ID + */ + private String parentId; + + /** + * 目标 ID + */ + private String targetId; + + /** + * IP 地址 + */ + private String ipAddress; + + private String userId; + +} diff --git a/luoo_comment/src/main/java/com/luoo/comment/pojo/CommentVo.java b/luoo_comment/src/main/java/com/luoo/comment/pojo/CommentVo.java new file mode 100644 index 0000000..ec880bf --- /dev/null +++ b/luoo_comment/src/main/java/com/luoo/comment/pojo/CommentVo.java @@ -0,0 +1,78 @@ +package com.luoo.comment.pojo; + +import lombok.Data; + +import java.util.Date; + +@Data +public class CommentVo { + + private String id; + /** + * 评论内容 + */ + private String content; + /** + * 发布时间 + */ + private Date publishTime; + /** + * 用户 ID + */ + private String userId; + /** + * 昵称 + */ + private String nickName; + /** + * 点赞数 + */ + private Integer thumbup; + /** + * 转发数 + */ + private Integer share; + /** + * 评论数量 + */ + private Integer comment; + /** + * 状态 + */ + private String state; + + /** + * 父节点 ID + */ + private String parentId; + + /** + * 文章 + */ + private String articleId; + + /** + * 层级 + */ + private Integer level; + + /** + * 目标ID + */ + private String targetId; + + /** + * 目标对象 + */ + private CommentVo targetComment; + + /** + * 评论类型 + */ + private String type; + + /** + * 城市 + */ + private String city; +} diff --git a/luoo_comment/src/main/java/com/luoo/comment/pojo/LoginAuthDto.java b/luoo_comment/src/main/java/com/luoo/comment/pojo/LoginAuthDto.java new file mode 100644 index 0000000..6dee043 --- /dev/null +++ b/luoo_comment/src/main/java/com/luoo/comment/pojo/LoginAuthDto.java @@ -0,0 +1,29 @@ +package com.luoo.comment.pojo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel(value = "登录人信息") +public class LoginAuthDto implements Serializable { + private static final long serialVersionUID = -1137852221455042256L; + @ApiModelProperty(value = "用户ID") + private String userId; + @ApiModelProperty(value = "登录名") + private String loginName; + @ApiModelProperty(value = "用户名") + private String userName; + + public LoginAuthDto() { + } + + public LoginAuthDto(String userId, String loginName, String userName) { + this.userId = userId; + this.loginName = loginName; + this.userName = userName; + } + +} diff --git a/luoo_comment/src/main/java/com/luoo/comment/service/CommentService.java b/luoo_comment/src/main/java/com/luoo/comment/service/CommentService.java index 97aad8e..7b371ad 100644 --- a/luoo_comment/src/main/java/com/luoo/comment/service/CommentService.java +++ b/luoo_comment/src/main/java/com/luoo/comment/service/CommentService.java @@ -1,87 +1,26 @@ package com.luoo.comment.service; -import com.luoo.comment.dao.CommentDao; import com.luoo.comment.pojo.Comment; -import org.springframework.beans.factory.annotation.Autowired; +import com.luoo.comment.pojo.CommentDto; +import com.luoo.comment.pojo.CommentVo; import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; -import org.springframework.data.mongodb.core.query.Update; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import util.IdWorker; -import java.util.Date; import java.util.List; -@Service -@Transactional -public class CommentService { +public interface CommentService { - @Autowired - private CommentDao commentDao; + Comment findById(String id); - @Autowired - private IdWorker idWorker; + void save(CommentDto commentDto); - @Autowired - private MongoTemplate mongoTemplate; - public List findAll() { - return commentDao.findAll(); - } + void update(Comment comment); - public Comment findById(String id) { - return commentDao.findById(id).get(); - } + void deleteById(String id); - public void save(Comment comment){ - comment.set_id(idWorker.nextId()+""); - comment.setPublishtime(new Date()); - comment.setVisits(0); - comment.setShare(0); - comment.setThumbup(0); - comment.setComment(0); - comment.setState("1"); - // 如果当前添加的吐槽,有父节点,那么父节点的吐槽回复数要加一 - if (comment.getParentid()!=null && !"".equals(comment.getParentid())) { - Query query = new Query(); - query.addCriteria(Criteria.where("_id").is(comment.getParentid())); - Update update = new Update(); - update.inc("comment",1); - mongoTemplate.updateFirst(query,update,"spit"); - } - commentDao.save(comment); - } + Page findByParentId(String parentId, int page, int size); - public void update(Comment comment) { - commentDao.save(comment); - } + void thumbup(String commentId); - public void deleteById(String id) { - commentDao.deleteById(id); - } - - - public Page findByParentId(String parentid,int page,int size){ - - Pageable pageable = PageRequest.of(page-1,size); - return commentDao.findByParentid(parentid,pageable); - } - - public void thumbup(String commentId) { - - Query query = new Query(); - query.addCriteria(Criteria.where("_id").is("1")); - Update update = new Update(); - update.inc("thumbup",1); - mongoTemplate.updateFirst(query,update,"spit"); - } - - public List findByVolid(String volid) { - return commentDao.findByArticleid(volid); - } + List findByVolid(String volid); } diff --git a/luoo_comment/src/main/java/com/luoo/comment/service/impl/CommentServiceImpl.java b/luoo_comment/src/main/java/com/luoo/comment/service/impl/CommentServiceImpl.java new file mode 100644 index 0000000..233dbd2 --- /dev/null +++ b/luoo_comment/src/main/java/com/luoo/comment/service/impl/CommentServiceImpl.java @@ -0,0 +1,136 @@ +package com.luoo.comment.service.impl; + + +import cn.hutool.core.util.ObjectUtil; +import com.luoo.comment.dao.CommentDao; +import com.luoo.comment.enums.CommentStatusEnum; +import com.luoo.comment.pojo.Comment; +import com.luoo.comment.pojo.CommentDto; +import com.luoo.comment.pojo.CommentVo; +import com.luoo.comment.service.CommentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.*; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import util.IdWorker; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +@Transactional +public class CommentServiceImpl implements CommentService { + + @Autowired + private CommentDao commentDao; + + @Autowired + private IdWorker idWorker; + + @Autowired + private MongoTemplate mongoTemplate; + + + public Comment findById(String id) { + return commentDao.findById(id).get(); + } + + public void save(CommentDto commentDto){ + Comment comment = new Comment(); + comment.setContent(commentDto.getContent()); + comment.setPublishTime(new Date()); + comment.setUserId(commentDto.getUserId()); + comment.setComment(0); + comment.setParentId(commentDto.getParentId()); + comment.setArticleId(commentDto.getArticleId()); + comment.setLevel(1); + comment.setTargetId(commentDto.getTargetId()); + comment.setType(0); + comment.setCity("上海"); + comment.setId(String.valueOf(idWorker.nextId())); + comment.setShare(0); + comment.setThumbup(0); + comment.setComment(0); + comment.setState(CommentStatusEnum.NORMAL.getValue()); + // 如果当前添加的吐槽,有父节点,那么父节点的吐槽回复数要加一 + if (ObjectUtil.isNotEmpty(comment.getParentId())) { + // 更新父节点的评论回复数 + Query query = new Query(); + query.addCriteria(Criteria.where("_id").is(comment.getParentId())); + Update update = new Update(); + update.inc("comment",1); + mongoTemplate.updateFirst(query,update,Comment.class); + } + + if (ObjectUtil.isNotEmpty(comment.getTargetId())) { + Comment parentIdComment = mongoTemplate.findById(comment.getTargetId(), Comment.class); + comment.setLevel(parentIdComment.getLevel()+1); + Query query = new Query(); + query.addCriteria(Criteria.where("_id").is(comment.getTargetId())); + Update update = new Update(); + update.inc("comment",1); + mongoTemplate.updateFirst(query,update,Comment.class); + } + commentDao.save(comment); + } + + public void update(Comment comment) { + commentDao.save(comment); + } + + public void deleteById(String id) { + commentDao.deleteById(id); + } + + + public Page findByParentId(String parentId,int page,int size){ + Pageable pageable = PageRequest.of(page, size); + Query query = new Query(); + Criteria criteria = Criteria.where("parentId").is(parentId); + query.addCriteria(criteria); + Sort sort = Sort.by(Sort.Direction.ASC, "age"); + query.with(sort); + query.with(pageable); + List comments = mongoTemplate.find(query, Comment.class); + + List commentVos = comments.stream().map(Comment::convertVo).collect(Collectors.toList()); + + List targetComments = comments.stream().map(Comment::getTargetId).collect(Collectors.toList()); + + Map idCommentMap = commentVos.stream().collect(Collectors.toMap(CommentVo::getId, Function.identity())); + + long total = mongoTemplate.count(query, Comment.class); + +// boolean isChange = targetComments.removeAll(idCommentMap.keySet()); + + for (CommentVo commentVo : commentVos) { + if (commentVo.getLevel() > 2 && ObjectUtil.isNotEmpty(commentVo.getTargetId())) { + CommentVo targetCommentVo = idCommentMap.get(commentVo.getTargetId()); + if (targetCommentVo != null) { + commentVo.setTargetComment(targetCommentVo); + } + } + } + return new PageImpl<>(commentVos, pageable, total); + } + + public void thumbup(String commentId) { + + Query query = new Query(); + query.addCriteria(Criteria.where("_id").is("1")); + Update update = new Update(); + update.inc("thumbup",1); + mongoTemplate.updateFirst(query,update,"spit"); + } + + public List findByVolid(String volid) { + return commentDao.findByArticleId(volid); + } +} diff --git a/luoo_comment/src/main/java/com/luoo/comment/utils/ThreadLocalMap.java b/luoo_comment/src/main/java/com/luoo/comment/utils/ThreadLocalMap.java new file mode 100644 index 0000000..92bccf6 --- /dev/null +++ b/luoo_comment/src/main/java/com/luoo/comment/utils/ThreadLocalMap.java @@ -0,0 +1,84 @@ +package com.luoo.comment.utils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.HashMap; +import java.util.Map; + + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ThreadLocalMap { + /** + * The constant threadContext. + */ + private final static ThreadLocal> THREAD_CONTEXT = new MapThreadLocal(); + + /** + * Put. + * + * @param key the key + * @param value the value + */ + public static void put(String key, Object value) { + getContextMap().put(key, value); + } + + /** + * Remove object. + * + * @param key the key + * + * @return the object + */ + public static Object remove(String key) { + return getContextMap().remove(key); + } + + /** + * Get object. + * + * @param key the key + * + * @return the object + */ + public static Object get(String key) { + return getContextMap().get(key); + } + + private static class MapThreadLocal extends ThreadLocal> { + /** + * Initial value map. + * + * @return the map + */ + @Override + protected Map initialValue() { + return new HashMap(8) { + + private static final long serialVersionUID = 3637958959138295593L; + + @Override + public Object put(String key, Object value) { + return super.put(key, value); + } + }; + } + } + + /** + * 取得thread context Map的实例。 + * + * @return thread context Map的实例 + */ + private static Map getContextMap() { + return THREAD_CONTEXT.get(); + } + + /** + * 清理线程所有被hold住的对象。以便重用! + */ + public static void remove() { + getContextMap().clear(); + } +} \ No newline at end of file