文章目录
创建管理员服务提供者
创建项目
创建一个名为itoken-service-admin
的服务提供者项目
POM
<?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>
<parent>
<groupId>com.funtl</groupId>
<artifactId>itoken-dependencies</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../itoken-dependencies/pom.xml</relativePath>
</parent>
<artifactId>itoken-service-admin</artifactId>
<packaging>jar</packaging>
<name>itoken-service-admin</name>
<url>http://www.funtl.com</url>
<inceptionYear>2018-Now</inceptionYear>
<dependencies>
<!-- Spring Boot Begin -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Boot End -->
<!-- Spring Cloud Begin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!-- Spring Cloud End -->
<!-- Spring Boot Admin Begin -->
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>
<!-- Spring Boot Admin End -->
<!-- Database Begin -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Database End -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.funtl.itoken.service.admin.ServiceAdminApplication</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.4.4</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
Application
package com.funtl.itoken.service.admin;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@EnableEurekaClient
@MapperScan(basePackages = "com.funtl.itoken.service.admin.mapper")
public class ServiceAdminApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceAdminApplication.class, args);
}
}
本地配置
bootstrap.yml
spring:
cloud:
config:
uri: http://localhost:8888
name: itoken-service-admin
label: master
profile: dev
bootstrap-prod.yml
spring:
cloud:
config:
uri: http://192.168.75.137:8888
name: itoken-service-admin
label: master
profile: prod
云配置
itoken-service-admin-dev.yml
spring:
application:
name: itoken-service-admin
boot:
admin:
client:
url: http://localhost:8084
zipkin:
base-url: http://localhost:9411
datasource:
druid:
url: jdbc:mysql://192.168.75.133:3306/itoken-service-admin?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
initial-size: 1
min-idle: 1
max-active: 20
test-on-borrow: true
# MySQL 8.x: com.mysql.cj.jdbc.Driver
driver-class-name: com.mysql.jdbc.Driver
server:
port: 8501
mybatis:
type-aliases-package: com.funtl.itoken.service.admin.domain
mapper-locations: classpath:mapper/*.xml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
management:
endpoint:
health:
show-details: always
endpoints:
web:
exposure:
include: health,info
itoken-service-admin-prod.yml
spring:
application:
name: itoken-service-admin
boot:
admin:
client:
url: http://192.168.75.137:8084
zipkin:
base-url: http://192.168.75.137:9411
datasource:
druid:
url: jdbc:mysql://192.168.75.133:3306/itoken-service-admin?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
initial-size: 1
min-idle: 1
max-active: 20
test-on-borrow: true
# MySQL 8.x: com.mysql.cj.jdbc.Driver
driver-class-name: com.mysql.jdbc.Driver
server:
port: 8501
mybatis:
type-aliases-package: com.funtl.itoken.service.admin.domain
mapper-locations: classpath:mapper/*.xml
eureka:
client:
serviceUrl:
defaultZone: http://192.168.75.137:8761/eureka/,http://192.168.75.137:8861/eureka/,http://192.168.75.137:8961/eureka/
management:
endpoint:
health:
show-details: always
endpoints:
web:
exposure:
include: health,info
整合 Durid+tk.MyBatis+PageHelper
链接:https://blog.csdn.net/jk418756/article/details/87189793
创建接口
AdminService
package com.funtl.itoken.service.admin.service;
import com.funtl.itoken.service.admin.domain.TbSysUser;
public interface AdminService {
/**
* 注册
* @param tbSysUser
*/
void register(TbSysUser tbSysUser);
/**
* 登录
* @param loginCode 登录账号
* @param plantPassword 明文登录密码
* @return
*/
TbSysUser login(String loginCode, String plantPassword);
}
AdminServiceImpl
package com.funtl.itoken.service.admin.service.impl;
import com.funtl.itoken.service.admin.domain.TbSysUser;
import com.funtl.itoken.service.admin.mapper.TbSysUserMapper;
import com.funtl.itoken.service.admin.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
@Service
@Transactional(readOnly = true)
public class AdminServiceImpl implements AdminService {
@Autowired
private TbSysUserMapper tbSysUserMapper;
@Transactional(readOnly = false)
@Override
public void register(TbSysUser tbSysUser) {
tbSysUserMapper.insert(tbSysUser);
}
@Override
public TbSysUser login(String loginCode, String plantPassword) {
Example example = new Example(TbSysUser.class);
example.createCriteria().andEqualTo("loginCode", loginCode);
TbSysUser tbSysUser = tbSysUserMapper.selectOneByExample(example);
if (tbSysUser != null) {
String password = DigestUtils.md5DigestAsHex(plantPassword.getBytes());
if (password.equals(tbSysUser.getPassword())) {
return tbSysUser;
}
}
return null;
}
}
MyBatis 代码自动生成配置
generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 引入数据库连接配置 -->
<properties resource="jdbc.properties"/>
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<!-- 配置 tk.mybatis 插件 -->
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.MyMapper"/>
</plugin>
<!-- 配置数据库连接 -->
<jdbcConnection
driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.connectionURL}"
userId="${jdbc.username}"
password="${jdbc.password}">
</jdbcConnection>
<!-- 配置实体类存放路径 -->
<javaModelGenerator targetPackage="com.funtl.itoken.service.admin.domain" targetProject="src/main/java"/>
<!-- 配置 XML 存放路径 -->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>
<!-- 配置 DAO 存放路径 -->
<javaClientGenerator
targetPackage="com.funtl.itoken.service.admin.mapper"
targetProject="src/main/java"
type="XMLMAPPER"/>
<!-- 配置需要生成的表,% 代表所有 -->
<table tableName="tb_sys_user">
<!-- mysql 配置 -->
<generatedKey column="user_code" sqlStatement="Mysql" identity="false"/>
</table>
</context>
</generatorConfiguration>
# jdbc.properties
# MySQL 8.x: com.mysql.cj.jdbc.Driver
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://192.168.75.133:3306/itoken-service-admin?useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=123456
服务所需数据库SQL脚本
/*
SQLyog v12.2.6 (64 bit)
MySQL - 5.7.22 : Database - itoken-service-admin
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`itoken-service-admin` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `itoken-service-admin`;
DROP TABLE IF EXISTS tb_sys_user;
-- 管理员表
CREATE TABLE tb_sys_user
(
user_code varchar(100) NOT NULL COMMENT '用户编码',
login_code varchar(100) NOT NULL COMMENT '登录账号',
user_name varchar(100) NOT NULL COMMENT '用户昵称',
password varchar(100) NOT NULL COMMENT '登录密码',
email varchar(300) COMMENT '电子邮箱',
mobile varchar(100) COMMENT '手机号码',
phone varchar(100) COMMENT '办公电话',
sex char(1) COMMENT '用户性别',
avatar varchar(1000) COMMENT '头像路径',
sign varchar(200) COMMENT '个性签名',
wx_openid varchar(100) COMMENT '绑定的微信号',
mobile_imei varchar(100) COMMENT '绑定的手机串号',
user_type varchar(16) NOT NULL COMMENT '用户类型',
ref_code varchar(64) COMMENT '用户类型引用编号',
ref_name varchar(100) COMMENT '用户类型引用姓名',
mgr_type char(1) NOT NULL COMMENT '管理员类型(0非管理员 1系统管理员 2二级管理员)',
pwd_security_level decimal(1) COMMENT '密码安全级别(0初始 1很弱 2弱 3安全 4很安全)',
pwd_update_date datetime COMMENT '密码最后更新时间',
pwd_update_record varchar(1000) COMMENT '密码修改记录',
pwd_question varchar(200) COMMENT '密保问题',
pwd_question_answer varchar(200) COMMENT '密保问题答案',
pwd_question_2 varchar(200) COMMENT '密保问题2',
pwd_question_answer_2 varchar(200) COMMENT '密保问题答案2',
pwd_question_3 varchar(200) COMMENT '密保问题3',
pwd_question_answer_3 varchar(200) COMMENT '密保问题答案3',
pwd_quest_update_date datetime COMMENT '密码问题修改时间',
last_login_ip varchar(100) COMMENT '最后登陆IP',
last_login_date datetime COMMENT '最后登陆时间',
freeze_date datetime COMMENT '冻结时间',
freeze_cause varchar(200) COMMENT '冻结原因',
user_weight decimal(8) DEFAULT 0 COMMENT '用户权重(降序)',
status char NOT NULL COMMENT '状态(0正常 1删除 2停用 3冻结)',
create_by varchar(64) NOT NULL COMMENT '创建者',
create_date datetime NOT NULL COMMENT '创建时间',
update_by varchar(64) NOT NULL COMMENT '更新者',
update_date datetime NOT NULL COMMENT '更新时间',
remarks varchar(500) COMMENT '备注信息',
corp_code varchar(64) DEFAULT '0' NOT NULL COMMENT '归属集团Code',
corp_name varchar(100) DEFAULT 'iToken' NOT NULL COMMENT '归属集团Name',
extend_s1 varchar(500) COMMENT '扩展 String 1',
extend_s2 varchar(500) COMMENT '扩展 String 2',
extend_s3 varchar(500) COMMENT '扩展 String 3',
extend_s4 varchar(500) COMMENT '扩展 String 4',
extend_s5 varchar(500) COMMENT '扩展 String 5',
extend_s6 varchar(500) COMMENT '扩展 String 6',
extend_s7 varchar(500) COMMENT '扩展 String 7',
extend_s8 varchar(500) COMMENT '扩展 String 8',
extend_i1 decimal(19) COMMENT '扩展 Integer 1',
extend_i2 decimal(19) COMMENT '扩展 Integer 2',
extend_i3 decimal(19) COMMENT '扩展 Integer 3',
extend_i4 decimal(19) COMMENT '扩展 Integer 4',
extend_f1 decimal(19,4) COMMENT '扩展 Float 1',
extend_f2 decimal(19,4) COMMENT '扩展 Float 2',
extend_f3 decimal(19,4) COMMENT '扩展 Float 3',
extend_f4 decimal(19,4) COMMENT '扩展 Float 4',
extend_d1 datetime COMMENT '扩展 Date 1',
extend_d2 datetime COMMENT '扩展 Date 2',
extend_d3 datetime COMMENT '扩展 Date 3',
extend_d4 datetime COMMENT '扩展 Date 4',
PRIMARY KEY (user_code)
) COMMENT = '用户表';
CREATE INDEX idx_sys_user_lc ON tb_sys_user (login_code ASC);
CREATE INDEX idx_sys_user_email ON tb_sys_user (email ASC);
CREATE INDEX idx_sys_user_mobile ON tb_sys_user (mobile ASC);
CREATE INDEX idx_sys_user_wo ON tb_sys_user (wx_openid ASC);
CREATE INDEX idx_sys_user_imei ON tb_sys_user (mobile_imei ASC);
CREATE INDEX idx_sys_user_rt ON tb_sys_user (user_type ASC);
CREATE INDEX idx_sys_user_rc ON tb_sys_user (ref_code ASC);
CREATE INDEX idx_sys_user_mt ON tb_sys_user (mgr_type ASC);
CREATE INDEX idx_sys_user_us ON tb_sys_user (user_weight ASC);
CREATE INDEX idx_sys_user_ud ON tb_sys_user (update_date ASC);
CREATE INDEX idx_sys_user_status ON tb_sys_user (status ASC);
CREATE INDEX idx_sys_user_cc ON tb_sys_user (corp_code ASC);
单元测试代码
package com.funtl.itoken.service.admin.test.service;
import com.funtl.itoken.service.admin.ServiceAdminApplication;
import com.funtl.itoken.service.admin.domain.TbSysUser;
import com.funtl.itoken.service.admin.service.AdminService;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import java.util.Date;
import java.util.UUID;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ServiceAdminApplication.class)
@ActiveProfiles(value = "prod")
@Transactional
@Rollback
public class AdminServiceTest {
@Autowired
private AdminService adminService;
/**
* 注册
*/
@Test
public void testRegister() {
TbSysUser tbSysUser = new TbSysUser();
tbSysUser.setUserCode(UUID.randomUUID().toString());
tbSysUser.setLoginCode("lusifer@funtl.com");
tbSysUser.setUserName("Lusifer");
tbSysUser.setUserType("1");
tbSysUser.setMgrType("1");
tbSysUser.setStatus("0");
tbSysUser.setCreateBy(tbSysUser.getUserCode());
tbSysUser.setCreateDate(new Date());
tbSysUser.setUpdateBy(tbSysUser.getUserCode());
tbSysUser.setUpdateDate(new Date());
tbSysUser.setCorpCode("0");
tbSysUser.setCorpName("iToken");
tbSysUser.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
adminService.register(tbSysUser);
}
/**
* 登录
*/
@Test
public void testLogin() {
TbSysUser tbSysUser = adminService.login("lusifer@funtl.com", "123456");
Assert.assertNotNull(tbSysUser);
}
}
整合Lombok简化代码
idea安装Lombok插件
maven引入依赖
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
整合谷歌Guava 工具类
maven引入依赖
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.1-jre</version>
</dependency>
通用数据类型BaseResult
引入lombok后,创建实体类BaseResult用来返回数据
@Data
public class BaseResult implements Serializable {
public static final String RESULT_OK = "OK";
public static final String RESULT_ERROR = "ERROR";
public static final String SUCCESS = "成功操作";
private String result;
private Object data;
private String success;
private Cursor cursor;
private List<Error> errors;
public BaseResult() {
}
public BaseResult(String result, Object data, String success, Cursor cursor, List<Error> errors) {
this.result = result;
this.data = data;
this.success = success;
this.cursor = cursor;
this.errors = errors;
}
public static BaseResult OK(Object data) {
return new BaseResult(RESULT_OK,data,SUCCESS, null, null);
}
public static BaseResult OK() {
return new BaseResult(RESULT_OK,null,SUCCESS, null, null);
}
public static BaseResult ERROR(List<BaseResult.Error> errors) {
return new BaseResult(RESULT_ERROR,null,"", null, errors);
}
@Data
public static class Cursor {
private int total;
private int offset;
private int limit;
}
@Data
public static class Error {
private String field;
private String message;
}
}
AdminController
@RestController
public class AdminController {
@Autowired
private AdminService adminService;
@GET
@RequestMapping(value = "/login")
public BaseResult login(String loginCode, String passWord) {
TbSysUser tbSysUser = adminService.login(loginCode, passWord);
//登录校验
if (tbSysUser == null) {
return BaseResult.OK(tbSysUser);
} else {
return BaseResult.ERROR(null);
}
}
/**
* 登录校验
* @param loginCode
* @param password
* @return
*/
private BaseResult checkLogin(String loginCode, String password) {
BaseResult baseResult = null;
List<BaseResult.Error> errors = new ArrayList<>();
if (StringUtils.isNotBlank(loginCode)) {
BaseResult.Error error = new BaseResult.Error();
error.setField("loginCode");
error.setMessage("登录账户不能为空");
errors.add(error);
}
if (StringUtils.isNotBlank(password)) {
BaseResult.Error error = new BaseResult.Error();
error.setField("password");
error.setMessage("登录密码不能为空");
errors.add(error);
}
return null;
}
}
特别说明
由于服务代码大同小异,故仅 管理员服务 提供相关代码案例,其它服务无特殊情况不再以博客性质提供代码,具体编程手法请参照我的视频。
创建管理员服务消费者
创建itoken-common-web依赖项目
dependencies添加jackson依赖
导入maven
<!-- jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
编写工具类放置于itoken-common中
/**
* Jackson 工具类
* <p>Title: MapperUtils</p>
* <p>Description: </p>
*
* @author Lusifer
* @version 1.0.0
* @date 2018/3/4 21:50
*/
public class MapperUtils {
private final static ObjectMapper objectMapper = new ObjectMapper();
public static ObjectMapper getInstance() {
return objectMapper;
}
/**
* 转换为 JSON 字符串
*
* @param obj
* @return
* @throws Exception
*/
public static String obj2json(Object obj) throws Exception {
return objectMapper.writeValueAsString(obj);
}
/**
* 转换为 JSON 字符串,忽略空值
*
* @param obj
* @return
* @throws Exception
*/
public static String obj2jsonIgnoreNull(Object obj) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return mapper.writeValueAsString(obj);
}
/**
* 转换为 JavaBean
*
* @param jsonString
* @param clazz
* @return
* @throws Exception
*/
public static <T> T json2pojo(String jsonString, Class<T> clazz) throws Exception {
objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
return objectMapper.readValue(jsonString, clazz);
}
/**
* 字符串转换为 Map<String, Object>
*
* @param jsonString
* @return
* @throws Exception
*/
public static <T> Map<String, Object> json2map(String jsonString) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return mapper.readValue(jsonString, Map.class);
}
/**
* 字符串转换为 Map<String, T>
*/
public static <T> Map<String, T> json2map(String jsonString, Class<T> clazz) throws Exception {
Map<String, Map<String, Object>> map = objectMapper.readValue(jsonString, new TypeReference<Map<String, T>>() {
});
Map<String, T> result = new HashMap<String, T>();
for (Map.Entry<String, Map<String, Object>> entry : map.entrySet()) {
result.put(entry.getKey(), map2pojo(entry.getValue(), clazz));
}
return result;
}
/**
* 深度转换 JSON 成 Map
*
* @param json
* @return
*/
public static Map<String, Object> json2mapDeeply(String json) throws Exception {
return json2MapRecursion(json, objectMapper);
}
/**
* 把 JSON 解析成 List,如果 List 内部的元素存在 jsonString,继续解析
*
* @param json
* @param mapper 解析工具
* @return
* @throws Exception
*/
private static List<Object> json2ListRecursion(String json, ObjectMapper mapper) throws Exception {
if (json == null) {
return null;
}
List<Object> list = mapper.readValue(json, List.class);
for (Object obj : list) {
if (obj != null && obj instanceof String) {
String str = (String) obj;
if (str.startsWith("[")) {
obj = json2ListRecursion(str, mapper);
} else if (obj.toString().startsWith("{")) {
obj = json2MapRecursion(str, mapper);
}
}
}
return list;
}
/**
* 把 JSON 解析成 Map,如果 Map 内部的 Value 存在 jsonString,继续解析
*
* @param json
* @param mapper
* @return
* @throws Exception
*/
private static Map<String, Object> json2MapRecursion(String json, ObjectMapper mapper) throws Exception {
if (json == null) {
return null;
}
Map<String, Object> map = mapper.readValue(json, Map.class);
for (Map.Entry<String, Object> entry : map.entrySet()) {
Object obj = entry.getValue();
if (obj != null && obj instanceof String) {
String str = ((String) obj);
if (str.startsWith("[")) {
List<?> list = json2ListRecursion(str, mapper);
map.put(entry.getKey(), list);
} else if (str.startsWith("{")) {
Map<String, Object> mapRecursion = json2MapRecursion(str, mapper);
map.put(entry.getKey(), mapRecursion);
}
}
}
return map;
}
/**
* 将 JSON 数组转换为集合
*
* @param jsonArrayStr
* @param clazz
* @return
* @throws Exception
*/
public static <T> List<T> json2list(String jsonArrayStr, Class<T> clazz) throws Exception {
JavaType javaType = getCollectionType(ArrayList.class, clazz);
List<T> list = (List<T>) objectMapper.readValue(jsonArrayStr, javaType);
return list;
}
/**
* 获取泛型的 Collection Type
*
* @param collectionClass 泛型的Collection
* @param elementClasses 元素类
* @return JavaType Java类型
* @since 1.0
*/
public static JavaType getCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {
return objectMapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
}
/**
* 将 Map 转换为 JavaBean
*
* @param map
* @param clazz
* @return
*/
public static <T> T map2pojo(Map map, Class<T> clazz) {
return objectMapper.convertValue(map, clazz);
}
/**
* 将 Map 转换为 JSON
*
* @param map
* @return
*/
public static String mapToJson(Map map) {
try {
return objectMapper.writeValueAsString(map);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
/**
* 将 JSON 对象转换为 JavaBean
*
* @param obj
* @param clazz
* @return
*/
public static <T> T obj2pojo(Object obj, Class<T> clazz) {
return objectMapper.convertValue(obj, clazz);
}
}
创建服务消费者Feign
Spring Cloud Netflix服务搭建详解(一):服务的注册与发现