mirror of
https://gitee.com/jzsw-it/yexuejc-base.git
synced 2025-06-07 22:34:04 +08:00
Merge branch 'master' into develop
This commit is contained in:
commit
556f2a49d2
1
.gitignore
vendored
1
.gitignore
vendored
@ -23,3 +23,4 @@ nbbuild/
|
|||||||
dist/
|
dist/
|
||||||
nbdist/
|
nbdist/
|
||||||
.nb-gradle/
|
.nb-gradle/
|
||||||
|
*.iml~
|
||||||
|
@ -19,11 +19,11 @@ gitee:https://gitee.com/jzsw-it/yexuejc-base
|
|||||||
>
|
>
|
||||||
>4. `1.1.9` 升级JWT为单例类
|
>4. `1.1.9` 升级JWT为单例类
|
||||||
>5. `1.2.3` 修复RSA加密(签名)Base64Url 问题,如需使用RSA请使用1.2.3+
|
>5. `1.2.3` 修复RSA加密(签名)Base64Url 问题,如需使用RSA请使用1.2.3+
|
||||||
>##### 6. 从`1.3.0`开始,版本维护转由`成都极致思维网络科技有限公司`向maven中央仓库发布版本,同时变更组织`groupId`为`top.yexuejc`。使用者请尽快升级到`1.3.0`以上(1.3.0代码向下兼容)
|
>##### 6. 从`1.3.0`开始,变更组织`groupId`为`top.yexuejc`。使用者请尽快升级到`1.3.0`以上(1.3.0代码向下兼容)
|
||||||
|
|
||||||
|
|
||||||
### 使用
|
### 使用
|
||||||
>yexuejc.base.version=1.3.0
|
>yexuejc.base.version=1.4.1
|
||||||
|
|
||||||
pom.xml
|
pom.xml
|
||||||
```
|
```
|
||||||
|
66
UPDATE.md
66
UPDATE.md
@ -1,6 +1,72 @@
|
|||||||
yexuejc-base 更新记录
|
yexuejc-base 更新记录
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
#### version :1.4.4
|
||||||
|
**time:2021-4-24 00:41:31** <br/>
|
||||||
|
**branch:** master <br/>
|
||||||
|
**update:** <br/>
|
||||||
|
>1. JsonUtil类修复格式化出现的时区差:现使用TimeZone.getDefault()时区
|
||||||
|
#
|
||||||
|
#### version :1.4.3
|
||||||
|
**time:2021-2-6 11:42:49** <br/>
|
||||||
|
**branch:** master <br/>
|
||||||
|
**update:** <br/>
|
||||||
|
>1. DateTimeUtil类增加时间格式
|
||||||
|
#
|
||||||
|
#### version :1.4.2
|
||||||
|
**time:2021-2-3 11:40:11** <br/>
|
||||||
|
**branch:** master <br/>
|
||||||
|
**update:** <br/>
|
||||||
|
>1. 优化时间转换格式
|
||||||
|
>2. 增加注解 ToUeProperty 转换时间为时间戳的功能
|
||||||
|
#
|
||||||
|
#### version :1.4.1
|
||||||
|
**time:2021-1-31 12:59:24** <br/>
|
||||||
|
**branch:** master <br/>
|
||||||
|
**update:** <br/>
|
||||||
|
>1. 升级所有依赖
|
||||||
|
>1. 增加DateTimeUtil类的功能
|
||||||
|
#
|
||||||
|
#### version :1.4.0
|
||||||
|
**time:2020-5-18 12:06:14** <br/>
|
||||||
|
**branch:** master <br/>
|
||||||
|
**update:** <br/>
|
||||||
|
>1. 更新仓库地址 https://nexus.yexuejc.club/ 为 https://nexus.yexuejc.top/
|
||||||
|
>2. 优化Execl 和 Jwt 工具
|
||||||
|
#
|
||||||
|
#### version :1.3.9
|
||||||
|
**time:2019-1-11 16:50:51** <br/>
|
||||||
|
**branch:** master <br/>
|
||||||
|
**update:** <br/>
|
||||||
|
>1. RSA2 增加证书格式转换 JKS(xx.keystore) 、 PKCS12(xx.pfx)相互转换
|
||||||
|
#
|
||||||
|
|
||||||
|
#### version :1.3.8
|
||||||
|
**time:2019-1-11 13:28:12** <br/>
|
||||||
|
**branch:** master <br/>
|
||||||
|
**update:** <br/>
|
||||||
|
>1. [ToUeProperty](src/main/java/com/yexuejc/base/util/ToUeProperty.java) 增加 ignore
|
||||||
|
#
|
||||||
|
|
||||||
|
#### version :1.3.7
|
||||||
|
**time:2019-1-11 10:02:03** <br/>
|
||||||
|
**branch:** master <br/>
|
||||||
|
**update:** <br/>
|
||||||
|
>1. 考虑到向下兼容,回滚1.3.6【json增加下划线、驼峰互转】,考虑更优方案(解决加入下个版本)
|
||||||
|
#
|
||||||
|
|
||||||
|
#### version :1.3.6
|
||||||
|
**time:2019-1-10 14:55:13** <br/>
|
||||||
|
**branch:** master <br/>
|
||||||
|
**update:** <br/>
|
||||||
|
>1. json增加下划线、驼峰互转
|
||||||
|
#
|
||||||
|
#### version :1.3.5
|
||||||
|
**time:2019-1-7 17:19:22** <br/>
|
||||||
|
**branch:** master <br/>
|
||||||
|
**update:** <br/>
|
||||||
|
>1. objUtil 增加兼容类型
|
||||||
|
#
|
||||||
#### version :1.3.4
|
#### version :1.3.4
|
||||||
**time:2019-1-2 20:32:12** <br/>
|
**time:2019-1-2 20:32:12** <br/>
|
||||||
**branch:** master <br/>
|
**branch:** master <br/>
|
||||||
|
107
pom.xml
107
pom.xml
@ -6,10 +6,11 @@
|
|||||||
|
|
||||||
<groupId>top.yexuejc</groupId>
|
<groupId>top.yexuejc</groupId>
|
||||||
<artifactId>yexuejc-base</artifactId>
|
<artifactId>yexuejc-base</artifactId>
|
||||||
<version>1.3.4</version>
|
<version>1.4.4</version>
|
||||||
|
|
||||||
<name>${project.artifactId}</name>
|
<name>${project.artifactId}</name>
|
||||||
<url>https://github.com/yexuejc/yexuejc-base</url>
|
<url>https://github.com/yexuejc/yexuejc-base</url>
|
||||||
|
<description>Common toolkits based on JDK8 packaging</description>
|
||||||
|
|
||||||
<licenses>
|
<licenses>
|
||||||
<license>
|
<license>
|
||||||
@ -38,18 +39,24 @@
|
|||||||
</scm>
|
</scm>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<repos.yexuejc.url>https://nexus.yexuejc.club/repository/</repos.yexuejc.url>
|
<repos.yexuejc.url>https://nexus.yexuejc.top/repository/</repos.yexuejc.url>
|
||||||
<repos.mcworle.url>https://nexus.mcworle.com/repository/</repos.mcworle.url>
|
<repos.hm.url>https://nexus.hm3981.com/repository/</repos.hm.url>
|
||||||
<repos.aliyun.url>http://maven.aliyun.com/nexus/content/groups/public</repos.aliyun.url>
|
<repos.aliyun.url>http://maven.aliyun.com/nexus/content/groups/public</repos.aliyun.url>
|
||||||
<repos.jitpack.url>https://jitpack.io</repos.jitpack.url>
|
<repos.jitpack.url>https://jitpack.io</repos.jitpack.url>
|
||||||
<jjwt.version>0.7.0</jjwt.version>
|
<jjwt.version>0.9.1</jjwt.version>
|
||||||
<maven.compiler.verbose>true</maven.compiler.verbose>
|
<maven.compiler.verbose>true</maven.compiler.verbose>
|
||||||
<java.version>1.8</java.version>
|
<java.version>1.8</java.version>
|
||||||
<validation-api.version>1.1.0.Final</validation-api.version>
|
<validation-api.version>3.0.0</validation-api.version>
|
||||||
<commons-codec.version>1.10</commons-codec.version>
|
<commons-codec.version>1.15</commons-codec.version>
|
||||||
<commons-io.version>2.6</commons-io.version>
|
<commons-io.version>2.8.0</commons-io.version>
|
||||||
<bcprov-jdk15on.version>1.60</bcprov-jdk15on.version>
|
<bcprov-jdk15on.version>1.68</bcprov-jdk15on.version>
|
||||||
<guava.version>20.0</guava.version>
|
<guava.version>30.1-jre</guava.version>
|
||||||
|
<apache-poi.version>5.0.0</apache-poi.version>
|
||||||
|
<!-- 文件拷贝时的编码 -->
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
<!-- 编译时的编码 -->
|
||||||
|
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
@ -60,9 +67,15 @@
|
|||||||
<version>${jjwt.version}</version>
|
<version>${jjwt.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- 数据校验框架 -->
|
<!-- 数据校验框架 -->
|
||||||
|
<!-- <dependency>-->
|
||||||
|
<!-- <groupId>javax.validation</groupId>-->
|
||||||
|
<!-- <artifactId>validation-api</artifactId>-->
|
||||||
|
<!-- <version>${validation-api.version}</version>-->
|
||||||
|
<!-- </dependency>-->
|
||||||
|
<!-- https://mvnrepository.com/artifact/jakarta.validation/jakarta.validation-api -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.validation</groupId>
|
<groupId>jakarta.validation</groupId>
|
||||||
<artifactId>validation-api</artifactId>
|
<artifactId>jakarta.validation-api</artifactId>
|
||||||
<version>${validation-api.version}</version>
|
<version>${validation-api.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!--base64使用到的依赖-->
|
<!--base64使用到的依赖-->
|
||||||
@ -90,6 +103,18 @@
|
|||||||
<artifactId>guava</artifactId>
|
<artifactId>guava</artifactId>
|
||||||
<version>${guava.version}</version>
|
<version>${guava.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.poi</groupId>
|
||||||
|
<artifactId>poi</artifactId>
|
||||||
|
<version>${apache-poi.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.poi</groupId>
|
||||||
|
<artifactId>poi-ooxml</artifactId>
|
||||||
|
<version>${apache-poi.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
@ -99,6 +124,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.8.1</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<encoding>UTF-8</encoding>
|
<encoding>UTF-8</encoding>
|
||||||
<source>8</source>
|
<source>8</source>
|
||||||
@ -109,7 +135,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-source-plugin</artifactId>
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
<version>3.0.1</version>
|
<version>3.2.1</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>attach-sources</id>
|
<id>attach-sources</id>
|
||||||
@ -120,21 +146,22 @@
|
|||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
<!-- 使用spring boot的maven插件进行打包 -->
|
<!-- 使用spring boot的maven插件进行打包 -->
|
||||||
<plugin>
|
<!-- <plugin>-->
|
||||||
<groupId>org.springframework.boot</groupId>
|
<!-- <groupId>org.springframework.boot</groupId>-->
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
|
||||||
<executions>
|
<!-- <version>2.4.2</version>-->
|
||||||
<execution>
|
<!-- <executions>-->
|
||||||
<goals>
|
<!-- <execution>-->
|
||||||
<goal>build-info</goal>
|
<!-- <goals>-->
|
||||||
</goals>
|
<!-- <goal>build-info</goal>-->
|
||||||
</execution>
|
<!-- </goals>-->
|
||||||
</executions>
|
<!-- </execution>-->
|
||||||
<configuration>
|
<!-- </executions>-->
|
||||||
<!-- 是否打出可执行的jar包(仅支持Linux格式) -->
|
<!-- <configuration>-->
|
||||||
<executable>true</executable>
|
<!-- <!– 是否打出可执行的jar包(仅支持Linux格式) –>-->
|
||||||
</configuration>
|
<!-- <executable>true</executable>-->
|
||||||
</plugin>
|
<!-- </configuration>-->
|
||||||
|
<!-- </plugin>-->
|
||||||
<!-- Javadoc -->
|
<!-- Javadoc -->
|
||||||
<!-- <plugin>-->
|
<!-- <plugin>-->
|
||||||
<!-- <groupId>org.apache.maven.plugins</groupId>-->
|
<!-- <groupId>org.apache.maven.plugins</groupId>-->
|
||||||
@ -149,7 +176,8 @@
|
|||||||
<!-- </executions>-->
|
<!-- </executions>-->
|
||||||
<!-- </plugin>-->
|
<!-- </plugin>-->
|
||||||
<!-- GPG -->
|
<!-- GPG -->
|
||||||
<!--<plugin> <!– 进行延签 –>-->
|
<!-- 进行延签 -->
|
||||||
|
<!-- <plugin> -->
|
||||||
<!-- <groupId>org.apache.maven.plugins</groupId>-->
|
<!-- <groupId>org.apache.maven.plugins</groupId>-->
|
||||||
<!-- <artifactId>maven-gpg-plugin</artifactId>-->
|
<!-- <artifactId>maven-gpg-plugin</artifactId>-->
|
||||||
<!-- <version>1.6</version>-->
|
<!-- <version>1.6</version>-->
|
||||||
@ -195,7 +223,7 @@
|
|||||||
<!--<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>-->
|
<!--<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>-->
|
||||||
<!--</repository>-->
|
<!--</repository>-->
|
||||||
|
|
||||||
<!-- 私服仓库发布
|
<!-- 私服仓库发布-->
|
||||||
<repository>
|
<repository>
|
||||||
<id>releases</id>
|
<id>releases</id>
|
||||||
<name>nexus-release</name>
|
<name>nexus-release</name>
|
||||||
@ -206,18 +234,18 @@
|
|||||||
<name>nexus-snapshots</name>
|
<name>nexus-snapshots</name>
|
||||||
<url>${repos.yexuejc.url}maven-snapshots/</url>
|
<url>${repos.yexuejc.url}maven-snapshots/</url>
|
||||||
</snapshotRepository>
|
</snapshotRepository>
|
||||||
-->
|
|
||||||
|
|
||||||
|
<!--
|
||||||
<repository>
|
<repository>
|
||||||
<id>releases</id>
|
<id>releases</id>
|
||||||
<name>nexus-release</name>
|
<name>nexus-release</name>
|
||||||
<url>${repos.mcworle.url}maven-releases/</url>
|
<url>${repos.hm.url}maven-releases/</url>
|
||||||
</repository>
|
</repository>
|
||||||
<snapshotRepository>
|
<snapshotRepository>
|
||||||
<id>snapshots</id>
|
<id>snapshots</id>
|
||||||
<name>nexus-snapshots</name>
|
<name>nexus-snapshots</name>
|
||||||
<url>${repos.mcworle.url}maven-snapshots/</url>
|
<url>${repos.hm.url}maven-snapshots/</url>
|
||||||
</snapshotRepository>
|
</snapshotRepository>-->
|
||||||
</distributionManagement>
|
</distributionManagement>
|
||||||
|
|
||||||
<profiles>
|
<profiles>
|
||||||
@ -237,6 +265,19 @@
|
|||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<!--Javadoc-->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-gpg-plugin</artifactId>
|
<artifactId>maven-gpg-plugin</artifactId>
|
||||||
|
@ -1,14 +1,11 @@
|
|||||||
package com.yexuejc.base.encrypt;
|
package com.yexuejc.base.encrypt;
|
||||||
|
|
||||||
|
|
||||||
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.codec.binary.Base64;
|
||||||
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
||||||
|
|
||||||
import javax.crypto.Cipher;
|
import javax.crypto.Cipher;
|
||||||
import javax.crypto.NoSuchPaddingException;
|
import javax.crypto.NoSuchPaddingException;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.*;
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.UnsupportedEncodingException;
|
|
||||||
import java.security.*;
|
import java.security.*;
|
||||||
import java.security.interfaces.RSAPrivateKey;
|
import java.security.interfaces.RSAPrivateKey;
|
||||||
import java.security.interfaces.RSAPublicKey;
|
import java.security.interfaces.RSAPublicKey;
|
||||||
@ -17,7 +14,7 @@ import java.security.spec.PKCS8EncodedKeySpec;
|
|||||||
import java.security.spec.X509EncodedKeySpec;
|
import java.security.spec.X509EncodedKeySpec;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RSA加解密 配置模式
|
* RSA加解密 配置模式
|
||||||
@ -28,7 +25,7 @@ import java.util.Map;
|
|||||||
* @date: 2018/5/15 14:39
|
* @date: 2018/5/15 14:39
|
||||||
*/
|
*/
|
||||||
public class RSA {
|
public class RSA {
|
||||||
|
private static Logger log = Logger.getLogger(RSA.class.getName());
|
||||||
public static final String CHARSET = "UTF-8";
|
public static final String CHARSET = "UTF-8";
|
||||||
public static final String RSA_ALGORITHM = "RSA";
|
public static final String RSA_ALGORITHM = "RSA";
|
||||||
/**
|
/**
|
||||||
@ -71,7 +68,6 @@ public class RSA {
|
|||||||
*/
|
*/
|
||||||
public static SignAlgorithm signAlgorithm = SignAlgorithm.SHA1withRSA;
|
public static SignAlgorithm signAlgorithm = SignAlgorithm.SHA1withRSA;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成密钥对
|
* 生成密钥对
|
||||||
*
|
*
|
||||||
@ -119,11 +115,9 @@ public class RSA {
|
|||||||
Map<String, String> keyPairMap = new HashMap<String, String>(2);
|
Map<String, String> keyPairMap = new HashMap<String, String>(2);
|
||||||
keyPairMap.put("publicKey", publicKeyStr);
|
keyPairMap.put("publicKey", publicKeyStr);
|
||||||
keyPairMap.put("privateKey", privateKeyStr);
|
keyPairMap.put("privateKey", privateKeyStr);
|
||||||
|
|
||||||
return keyPairMap;
|
return keyPairMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 得到公钥
|
* 得到公钥
|
||||||
*
|
*
|
||||||
@ -203,7 +197,6 @@ public class RSA {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 私钥加密
|
* 私钥加密
|
||||||
*
|
*
|
||||||
@ -310,9 +303,7 @@ public class RSA {
|
|||||||
|
|
||||||
private static Signature signature;
|
private static Signature signature;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* /**
|
|
||||||
* 私钥签名:默认算法SHA1withRSA
|
* 私钥签名:默认算法SHA1withRSA
|
||||||
* <p>
|
* <p>
|
||||||
* 签名算法 {@link SignAlgorithm}
|
* 签名算法 {@link SignAlgorithm}
|
||||||
|
@ -2,14 +2,8 @@ package com.yexuejc.base.encrypt;
|
|||||||
|
|
||||||
import com.yexuejc.base.util.StrUtil;
|
import com.yexuejc.base.util.StrUtil;
|
||||||
|
|
||||||
import java.io.FileInputStream;
|
import java.io.*;
|
||||||
import java.io.FileNotFoundException;
|
import java.security.*;
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.security.KeyStore;
|
|
||||||
import java.security.KeyStoreException;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
import java.security.UnrecoverableKeyException;
|
|
||||||
import java.security.cert.Certificate;
|
import java.security.cert.Certificate;
|
||||||
import java.security.cert.CertificateException;
|
import java.security.cert.CertificateException;
|
||||||
import java.security.cert.CertificateFactory;
|
import java.security.cert.CertificateFactory;
|
||||||
@ -192,4 +186,122 @@ public class RSA2 {
|
|||||||
return (RSAPrivateKey) ks.getKey(alias, password.toCharArray());
|
return (RSAPrivateKey) ks.getKey(alias, password.toCharArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 证书格式转换 JKS(xx.keystore) 转 PKCS12(xx.pfx)
|
||||||
|
*
|
||||||
|
* @param inPath 证书输入文件路径
|
||||||
|
* @param outPath 证书输出文件路径
|
||||||
|
* @param oPwd 原证书密码
|
||||||
|
* @param nPwd 新证书密码(为空同原证书密码一致)
|
||||||
|
*/
|
||||||
|
public static void cover2Pfx(String inPath, String outPath, String oPwd, String nPwd) {
|
||||||
|
try {
|
||||||
|
FileInputStream fis = new FileInputStream(inPath);
|
||||||
|
FileOutputStream out = new FileOutputStream(outPath);
|
||||||
|
if (nPwd == null) {
|
||||||
|
nPwd = oPwd;
|
||||||
|
}
|
||||||
|
cover2Pfx(fis, out, oPwd.toCharArray(), nPwd.toCharArray());
|
||||||
|
out.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 证书格式转换 JKS(xx.keystore) 转 PKCS12(xx.pfx)
|
||||||
|
*
|
||||||
|
* @param fis 证书输入文件流
|
||||||
|
* @param out 证书输出文件流[自行关闭->out.close()]
|
||||||
|
* @param oPwd 原证书密码
|
||||||
|
* @param nPwd 新证书密码(为空同原证书密码一致)
|
||||||
|
*/
|
||||||
|
public static void cover2Pfx(FileInputStream fis, FileOutputStream out, char[] oPwd, char[] nPwd) {
|
||||||
|
try {
|
||||||
|
KeyStore inputKeyStore = KeyStore.getInstance("JKS");
|
||||||
|
cover(fis, out, oPwd, nPwd, inputKeyStore, "PKCS12");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 证书格式转换 PKCS12(xx.pfx) 转 JKS(xx.keystore)
|
||||||
|
*
|
||||||
|
* @param inPath 证书输入文件路径
|
||||||
|
* @param outPath 证书输出文件路径
|
||||||
|
* @param oPwd 原证书密码
|
||||||
|
* @param nPwd 新证书密码(为空同原证书密码一致)
|
||||||
|
*/
|
||||||
|
public static void cover2keyStore(String inPath, String outPath, String oPwd, String nPwd) {
|
||||||
|
try {
|
||||||
|
FileInputStream fis = new FileInputStream(inPath);
|
||||||
|
FileOutputStream out = new FileOutputStream(outPath);
|
||||||
|
if (nPwd == null) {
|
||||||
|
nPwd = oPwd;
|
||||||
|
}
|
||||||
|
cover2keyStore(fis, out, oPwd.toCharArray(), nPwd.toCharArray());
|
||||||
|
out.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 证书格式转换 PKCS12(xx.pfx) 转 JKS(xx.keystore)
|
||||||
|
*
|
||||||
|
* @param fis 证书输入文件流
|
||||||
|
* @param out 证书输出文件流[自行关闭->out.close()]
|
||||||
|
* @param oPwd 原证书密码
|
||||||
|
* @param nPwd 新证书密码(为空同原证书密码一致)
|
||||||
|
*/
|
||||||
|
public static void cover2keyStore(FileInputStream fis, FileOutputStream out, char[] oPwd, char[] nPwd) {
|
||||||
|
try {
|
||||||
|
KeyStore inputKeyStore = KeyStore.getInstance("PKCS12");
|
||||||
|
cover(fis, out, oPwd, nPwd, inputKeyStore, "JKS");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 证书转换操作
|
||||||
|
*
|
||||||
|
* @param fis 证书输入文件流
|
||||||
|
* @param out 证书输出文件流[自行关闭->out.close()]
|
||||||
|
* @param oPwd 原证书密码
|
||||||
|
* @param nPwd 新证书密码(为空同原证书密码一致)
|
||||||
|
* @param inputKeyStore 输入格式
|
||||||
|
* @param type 目标类型
|
||||||
|
* @throws IOException
|
||||||
|
* @throws NoSuchAlgorithmException
|
||||||
|
* @throws CertificateException
|
||||||
|
* @throws KeyStoreException
|
||||||
|
* @throws UnrecoverableKeyException
|
||||||
|
*/
|
||||||
|
public static void cover(FileInputStream fis, FileOutputStream out, char[] oPwd, char[] nPwd, KeyStore inputKeyStore, String type) throws IOException, NoSuchAlgorithmException, CertificateException, KeyStoreException, UnrecoverableKeyException {
|
||||||
|
inputKeyStore.load(fis, oPwd);
|
||||||
|
fis.close();
|
||||||
|
if (nPwd == null) {
|
||||||
|
nPwd = oPwd;
|
||||||
|
}
|
||||||
|
KeyStore outputKeyStore = KeyStore.getInstance(type);
|
||||||
|
outputKeyStore.load(null, nPwd);
|
||||||
|
Enumeration<String> enums = inputKeyStore.aliases();
|
||||||
|
while (enums.hasMoreElements()) {
|
||||||
|
String keyAlias = enums.nextElement();
|
||||||
|
System.out.println("alias=[" + keyAlias + "]");
|
||||||
|
if (inputKeyStore.isKeyEntry(keyAlias)) {
|
||||||
|
Key key = inputKeyStore.getKey(keyAlias, oPwd);
|
||||||
|
Certificate[] certChain = inputKeyStore.getCertificateChain(keyAlias);
|
||||||
|
outputKeyStore.setKeyEntry(keyAlias, key, nPwd, certChain);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
outputKeyStore.store(out, nPwd);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
cover2Pfx("D:\\mykeystore.keystore", "D:\\m1.pfx", "123456", null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
package com.yexuejc.base.pojo;
|
package com.yexuejc.base.pojo;
|
||||||
|
|
||||||
import com.yexuejc.base.util.JsonUtil;
|
import com.yexuejc.base.util.JsonUtil;
|
||||||
|
import jakarta.validation.constraints.Min;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
|
||||||
import javax.validation.constraints.Min;
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页 VO
|
* 分页 VO
|
||||||
|
@ -13,6 +13,11 @@ import java.util.Date;
|
|||||||
* @date: 2018/3/27 10:44
|
* @date: 2018/3/27 10:44
|
||||||
*/
|
*/
|
||||||
public class DateTimeUtil {
|
public class DateTimeUtil {
|
||||||
|
public static String DATE_PATTERN = "yyyy-MM-dd";
|
||||||
|
public static String TIME_PATTERN = "HH:mm:ss";
|
||||||
|
public static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
|
||||||
|
public static String DATE_TIME_MS_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
|
||||||
|
|
||||||
private DateTimeUtil() {
|
private DateTimeUtil() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,6 +153,55 @@ public class DateTimeUtil {
|
|||||||
return date;
|
return date;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LocalDate 转 Date
|
||||||
|
*
|
||||||
|
* @param localDate
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Date parseDate(LocalDate localDate) {
|
||||||
|
ZoneId zone = ZoneId.systemDefault();
|
||||||
|
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
|
||||||
|
return Date.from(instant);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LocalDateTime 转 Date
|
||||||
|
*
|
||||||
|
* @param localDateTime
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Date parseDate(LocalDateTime localDateTime) {
|
||||||
|
ZoneId zoneId = ZoneId.systemDefault();
|
||||||
|
ZonedDateTime zdt = localDateTime.atZone(zoneId);
|
||||||
|
return Date.from(zdt.toInstant());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LocalTime 转 Date
|
||||||
|
*
|
||||||
|
* @param localTime 时间
|
||||||
|
* @return 当前日期的指定时间
|
||||||
|
*/
|
||||||
|
public static Date parseDate(LocalTime localTime) {
|
||||||
|
LocalDate localDate = LocalDate.now();
|
||||||
|
return parseDate(localDate, localTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LocalDate + LocalTime 转 Date
|
||||||
|
*
|
||||||
|
* @param localDate 日期
|
||||||
|
* @param localTime 时间
|
||||||
|
* @return 指定日期的指定时间
|
||||||
|
*/
|
||||||
|
public static Date parseDate(LocalDate localDate, LocalTime localTime) {
|
||||||
|
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
|
||||||
|
ZoneId zone = ZoneId.systemDefault();
|
||||||
|
Instant instant = localDateTime.atZone(zone).toInstant();
|
||||||
|
return Date.from(instant);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Date 转 ZonedDateTime
|
* Date 转 ZonedDateTime
|
||||||
*
|
*
|
||||||
@ -172,30 +226,6 @@ public class DateTimeUtil {
|
|||||||
return instant.atZone(zoneId).toLocalDateTime();
|
return instant.atZone(zoneId).toLocalDateTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* LocalDateTime 转 Date
|
|
||||||
*
|
|
||||||
* @param localDateTime
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static Date parseLocalDateTime(LocalDateTime localDateTime) {
|
|
||||||
ZoneId zoneId = ZoneId.systemDefault();
|
|
||||||
ZonedDateTime zdt = localDateTime.atZone(zoneId);
|
|
||||||
return Date.from(zdt.toInstant());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LocalDate 转 Date
|
|
||||||
*
|
|
||||||
* @param localDate
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static Date parseData(LocalDate localDate) {
|
|
||||||
ZoneId zone = ZoneId.systemDefault();
|
|
||||||
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
|
|
||||||
return Date.from(instant);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Date 转 LocalDate
|
* Date 转 LocalDate
|
||||||
*
|
*
|
||||||
@ -204,9 +234,8 @@ public class DateTimeUtil {
|
|||||||
*/
|
*/
|
||||||
public static LocalDate parseLocalDate(Date date) {
|
public static LocalDate parseLocalDate(Date date) {
|
||||||
Instant instant = date.toInstant();
|
Instant instant = date.toInstant();
|
||||||
ZoneId zone = ZoneId.systemDefault();
|
ZoneId zoneId = ZoneId.systemDefault();
|
||||||
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
|
return instant.atZone(zoneId).toLocalDate();
|
||||||
return localDateTime.toLocalDate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -223,28 +252,77 @@ public class DateTimeUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Date 转 LocalTime
|
* Long 转 LocalDateTime
|
||||||
*
|
*
|
||||||
* @param localTime
|
* @param timestamp 13位(毫秒)
|
||||||
* @return 当前日期的指定时间
|
* @return
|
||||||
*/
|
*/
|
||||||
public static Date parseDate(LocalTime localTime) {
|
public static LocalDateTime parseLocalDateTime13(long timestamp) {
|
||||||
LocalDate localDate = LocalDate.now();
|
Instant instant = Instant.ofEpochMilli(timestamp);
|
||||||
return parseDate(localDate, localTime);
|
ZoneId zone = ZoneId.systemDefault();
|
||||||
|
return LocalDateTime.ofInstant(instant, zone);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Date 转 LocalTime
|
* Long 转 LocalDateTime
|
||||||
*
|
*
|
||||||
* @param localDate
|
* @param timestamp 10位(秒)
|
||||||
* @param localTime
|
* @return
|
||||||
* @return 指定日期的指定时间
|
|
||||||
*/
|
*/
|
||||||
public static Date parseDate(LocalDate localDate, LocalTime localTime) {
|
public static LocalDateTime parseLocalDateTime10(long timestamp) {
|
||||||
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
|
Instant instant = Instant.ofEpochMilli(timestamp * 1000);
|
||||||
|
ZoneId zone = ZoneId.systemDefault();
|
||||||
|
return LocalDateTime.ofInstant(instant, zone);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LocalDateTime 转 Long
|
||||||
|
*
|
||||||
|
* @param localDateTime
|
||||||
|
* @return 13位(毫秒)
|
||||||
|
*/
|
||||||
|
public static long parseLong(LocalDateTime localDateTime) {
|
||||||
ZoneId zone = ZoneId.systemDefault();
|
ZoneId zone = ZoneId.systemDefault();
|
||||||
Instant instant = localDateTime.atZone(zone).toInstant();
|
Instant instant = localDateTime.atZone(zone).toInstant();
|
||||||
return Date.from(instant);
|
return instant.toEpochMilli();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LocalDate 转 Long
|
||||||
|
*
|
||||||
|
* @param localDate
|
||||||
|
* @return 13位(毫秒)最后3位为0
|
||||||
|
*/
|
||||||
|
public static long parseLong(LocalDate localDate) {
|
||||||
|
ZoneId zone = ZoneId.systemDefault();
|
||||||
|
Instant instant = localDate.atStartOfDay(zone).toInstant();
|
||||||
|
return instant.toEpochMilli();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 格式化时间 <br/>
|
||||||
|
* 格式 yyyy-MM-dd HH:mm:ss
|
||||||
|
*
|
||||||
|
* @param dateTime
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String format(LocalDate dateTime) {
|
||||||
|
return format(dateTime, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 格式化时间
|
||||||
|
*
|
||||||
|
* @param dateTime
|
||||||
|
* @param pattern 格式 默认:yyyy-MM-dd
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String format(LocalDate dateTime, String pattern) {
|
||||||
|
if (StrUtil.isEmpty(pattern)) {
|
||||||
|
pattern = DATE_PATTERN;
|
||||||
|
}
|
||||||
|
DateTimeFormatter df = DateTimeFormatter.ofPattern(pattern);
|
||||||
|
return df.format(dateTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -255,7 +333,7 @@ public class DateTimeUtil {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static String format(LocalDateTime dateTime) {
|
public static String format(LocalDateTime dateTime) {
|
||||||
return format(dateTime, "");
|
return format(dateTime, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -266,13 +344,14 @@ public class DateTimeUtil {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static String format(LocalDateTime dateTime, String pattern) {
|
public static String format(LocalDateTime dateTime, String pattern) {
|
||||||
if (pattern.isEmpty()) {
|
if (StrUtil.isEmpty(pattern)) {
|
||||||
pattern = "yyyy-MM-dd HH:mm:ss";
|
pattern = DATE_TIME_PATTERN;
|
||||||
}
|
}
|
||||||
DateTimeFormatter df = DateTimeFormatter.ofPattern(pattern);
|
DateTimeFormatter df = DateTimeFormatter.ofPattern(pattern);
|
||||||
return df.format(dateTime);
|
return df.format(dateTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** public static void main(String[] args) {
|
/** public static void main(String[] args) {
|
||||||
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
System.out.println(df.format(zonedDateTime2Date(ZonedDateTime.now())));
|
System.out.println(df.format(zonedDateTime2Date(ZonedDateTime.now())));
|
||||||
|
@ -21,7 +21,7 @@ public class DateUtil {
|
|||||||
|
|
||||||
public static DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
|
public static DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
|
||||||
public static DateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm:ss");
|
public static DateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm:ss");
|
||||||
public static DateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
public static DateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
|
||||||
public static String DAY_START_TIME = "00:00:00";
|
public static String DAY_START_TIME = "00:00:00";
|
||||||
public static String DAY_END_TIME = "23:59:59";
|
public static String DAY_END_TIME = "23:59:59";
|
||||||
|
|
||||||
|
@ -1,5 +1,15 @@
|
|||||||
package com.yexuejc.base.util;
|
package com.yexuejc.base.util;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||||
|
import org.apache.poi.ss.usermodel.Row;
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* excel 格式验证工具
|
* excel 格式验证工具
|
||||||
*
|
*
|
||||||
@ -48,5 +58,20 @@ public class ExcelImportUtil {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void readExcel(String path) throws IOException {
|
||||||
|
Workbook wb = null;
|
||||||
|
if (isExcel2007(path)) {
|
||||||
|
wb = new XSSFWorkbook(new FileInputStream(new File(path)));
|
||||||
|
} else if (isExcel2003(path)) {
|
||||||
|
wb = new HSSFWorkbook(new FileInputStream(new File(path)));
|
||||||
|
} else {
|
||||||
|
throw new NullPointerException("请上传excel文件");
|
||||||
|
}
|
||||||
|
Sheet sheet = wb.getSheetAt(0);
|
||||||
|
for (int i = 2; i < sheet.getLastRowNum() + 1; i++) {
|
||||||
|
Row row = sheet.getRow(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.type.MapType;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.TimeZone;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -46,9 +47,26 @@ public class JsonUtil {
|
|||||||
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
|
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
|
||||||
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||||
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
|
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
|
||||||
|
//设置一下时区,可以和程序同步避免时区问题
|
||||||
|
objectMapper.setTimeZone(TimeZone.getDefault());
|
||||||
objectMapper.setDateFormat(DateUtil.DATE_TIME_FORMAT);
|
objectMapper.setDateFormat(DateUtil.DATE_TIME_FORMAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO 待优化
|
||||||
|
public static void initSnakeCase() {
|
||||||
|
//驼峰下划线互转
|
||||||
|
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 这个设置不能改变JsonUtil自带的objectMapper设置,只能修改传入objMapper的设置
|
||||||
|
* @param objMapper
|
||||||
|
*/
|
||||||
|
public static void initSnakeCase(ObjectMapper objMapper) {
|
||||||
|
//驼峰下划线互转
|
||||||
|
objMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 每调用一次生成一个全新的ObjectMapper供特殊场景使用,与通用ObjectMapper没有关系
|
* 每调用一次生成一个全新的ObjectMapper供特殊场景使用,与通用ObjectMapper没有关系
|
||||||
*
|
*
|
||||||
@ -60,6 +78,15 @@ public class JsonUtil {
|
|||||||
return objectMapper;
|
return objectMapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回 ObjectMapper对象,供外部设置特定参数
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static ObjectMapper getObjectMapper() {
|
||||||
|
return objectMapper;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将json转换为某个类
|
* 将json转换为某个类
|
||||||
*
|
*
|
||||||
@ -92,7 +119,6 @@ public class JsonUtil {
|
|||||||
*/
|
*/
|
||||||
public static <T> T json2Obj(String json, Class<T> cls) {
|
public static <T> T json2Obj(String json, Class<T> cls) {
|
||||||
T pojo = null;
|
T pojo = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
pojo = objectMapper.readValue(json, cls);
|
pojo = objectMapper.readValue(json, cls);
|
||||||
} catch (JsonParseException e) {
|
} catch (JsonParseException e) {
|
||||||
@ -101,12 +127,13 @@ public class JsonUtil {
|
|||||||
log.warning("json to Object JsonMappingException.\n" + e.getMessage());
|
log.warning("json to Object JsonMappingException.\n" + e.getMessage());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
log.warning("json to Object IOException.\n" + e.getMessage());
|
log.warning("json to Object IOException.\n" + e.getMessage());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
return pojo;
|
return pojo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Json字符串转换为Java对象
|
* Json字符串转换为Java对象
|
||||||
*
|
*
|
||||||
@ -220,4 +247,20 @@ public class JsonUtil {
|
|||||||
}
|
}
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 格式化输出
|
||||||
|
*
|
||||||
|
* @param obj 需要输出对象
|
||||||
|
* @return 格式化后的字符串
|
||||||
|
*/
|
||||||
|
public static String formatPrinter(Object obj) {
|
||||||
|
String json = null;
|
||||||
|
try {
|
||||||
|
json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
|
||||||
|
} catch (JsonProcessingException e) {
|
||||||
|
log.warning("json to Object JsonProcessingException.\n" + e.getMessage());
|
||||||
|
}
|
||||||
|
return json;
|
||||||
|
}
|
||||||
}
|
}
|
@ -124,4 +124,19 @@ public class JwtUtil {
|
|||||||
return JsonUtil.json2Obj(subject, cls);
|
return JsonUtil.json2Obj(subject, cls);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解密token为字符串
|
||||||
|
*
|
||||||
|
* @param token
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String parseStr(String token) {
|
||||||
|
String subject = null;
|
||||||
|
try {
|
||||||
|
subject = Jwts.parser().setSigningKey(JWT_SIGNATURE_KEY).parseClaimsJws(token).getBody().getSubject();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return subject;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,8 @@ package com.yexuejc.base.util;
|
|||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -10,7 +12,7 @@ import java.util.*;
|
|||||||
* @author maxf
|
* @author maxf
|
||||||
* @version 1.0
|
* @version 1.0
|
||||||
* @ClassName ObjUtil
|
* @ClassName ObjUtil
|
||||||
* @Description
|
* @Description 对象工具:对类的操作
|
||||||
* @date 2018/12/28 15:54
|
* @date 2018/12/28 15:54
|
||||||
*/
|
*/
|
||||||
public class ObjUtil {
|
public class ObjUtil {
|
||||||
@ -108,19 +110,66 @@ public class ObjUtil {
|
|||||||
fName = StrUtil.camelToUnderline(f.getName());
|
fName = StrUtil.camelToUnderline(f.getName());
|
||||||
}
|
}
|
||||||
boolean annotationPresent = f.isAnnotationPresent(ToUeProperty.class);
|
boolean annotationPresent = f.isAnnotationPresent(ToUeProperty.class);
|
||||||
|
boolean ignore = false;
|
||||||
|
Class<?> toType = null;
|
||||||
if (annotationPresent) {
|
if (annotationPresent) {
|
||||||
ToUeProperty annotation = f.getAnnotation(ToUeProperty.class);
|
ToUeProperty annotation = f.getAnnotation(ToUeProperty.class);
|
||||||
|
ignore = annotation.ignore();
|
||||||
String value = annotation.value();
|
String value = annotation.value();
|
||||||
if (StrUtil.isNotEmpty(value)) {
|
if (StrUtil.isNotEmpty(value)) {
|
||||||
fName = value;
|
fName = value;
|
||||||
}
|
}
|
||||||
|
if (!annotation.type().getClass().equals(ObjUtil.class)) {
|
||||||
|
toType = annotation.type();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//忽略
|
||||||
|
if (ignore) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
Object o = f.get(obj);
|
Object o = f.get(obj);
|
||||||
if (null == o || o.getClass().isPrimitive() || o instanceof String || o instanceof Enum) {
|
|
||||||
if (null == o && !putNull) {
|
if (null == o && !putNull) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
objMap.put(fName, f.get(obj));
|
if (null == o || isPrimitive(o) || o instanceof String || o instanceof Enum) {
|
||||||
|
objMap.put(fName, o);
|
||||||
|
} else if (o instanceof Date) {
|
||||||
|
if (toType != null) {
|
||||||
|
Date date = (Date) o;
|
||||||
|
if (toType.equals(Integer.class)) {
|
||||||
|
objMap.put(fName, (int) date.getTime() / 1000);
|
||||||
|
} else if (toType.equals(Long.class)) {
|
||||||
|
objMap.put(fName, date.getTime());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
objMap.put(fName, o);
|
||||||
|
}
|
||||||
|
} else if (o instanceof LocalDate) {
|
||||||
|
if (toType != null) {
|
||||||
|
LocalDate date = (LocalDate) o;
|
||||||
|
if (toType.equals(Integer.class)) {
|
||||||
|
objMap.put(fName, (int) DateTimeUtil.parseLong(date) / 1000);
|
||||||
|
} else if (toType.equals(Long.class)) {
|
||||||
|
objMap.put(fName, DateTimeUtil.parseLong(date));
|
||||||
|
} else if (toType.equals(String.class)) {
|
||||||
|
objMap.put(fName, DateTimeUtil.format(date));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
objMap.put(fName, o);
|
||||||
|
}
|
||||||
|
} else if (o instanceof LocalDateTime) {
|
||||||
|
if (toType != null) {
|
||||||
|
LocalDateTime date = (LocalDateTime) o;
|
||||||
|
if (toType.equals(Integer.class)) {
|
||||||
|
objMap.put(fName, (int) DateTimeUtil.parseLong(date) / 1000);
|
||||||
|
} else if (toType.equals(Long.class)) {
|
||||||
|
objMap.put(fName, DateTimeUtil.parseLong(date));
|
||||||
|
} else if (toType.equals(String.class)) {
|
||||||
|
objMap.put(fName, DateTimeUtil.format(date));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
objMap.put(fName, o);
|
||||||
|
}
|
||||||
} else if (o instanceof List) {
|
} else if (o instanceof List) {
|
||||||
List list = (List) o;
|
List list = (List) o;
|
||||||
List bodyList = new ArrayList();
|
List bodyList = new ArrayList();
|
||||||
@ -133,6 +182,23 @@ public class ObjUtil {
|
|||||||
if (bodyList.size() > 0) {
|
if (bodyList.size() > 0) {
|
||||||
objMap.put(fName, bodyList);
|
objMap.put(fName, bodyList);
|
||||||
}
|
}
|
||||||
|
} else if (o instanceof Map) {
|
||||||
|
Map map = (Map) o;
|
||||||
|
if (map.size() > 0) {
|
||||||
|
objMap.put(fName, map);
|
||||||
|
}
|
||||||
|
} else if (o instanceof Set) {
|
||||||
|
Set list = (Set) o;
|
||||||
|
Set bodyList = new HashSet();
|
||||||
|
list.forEach(it -> {
|
||||||
|
if (null != it) {
|
||||||
|
Map<String, Object> underlineMap = getUnderlineMap(it, isAnnotationAll, putNull);
|
||||||
|
bodyList.add(underlineMap);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (bodyList.size() > 0) {
|
||||||
|
objMap.put(fName, bodyList);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Map<String, Object> underlineMap = getUnderlineMap(o, isAnnotationAll, putNull);
|
Map<String, Object> underlineMap = getUnderlineMap(o, isAnnotationAll, putNull);
|
||||||
objMap.put(fName, underlineMap);
|
objMap.put(fName, underlineMap);
|
||||||
@ -144,74 +210,25 @@ public class ObjUtil {
|
|||||||
return objMap;
|
return objMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
public static void main(String[] args) {
|
* 判断是否基本类型(包括String,BigDecimal,Number)
|
||||||
B a = new B();
|
*
|
||||||
a.nameFirst = "张三";
|
* @param obj
|
||||||
a.ageInt = "5165458";
|
* @return
|
||||||
a.testAss = "asdasdsad";
|
*/
|
||||||
a.setaM1("method1");
|
public static boolean isPrimitive(Object obj) {
|
||||||
a.setbM1("b1Mthod1");
|
if (null == obj) {
|
||||||
a.protectedStr = "protectedStr";
|
return false;
|
||||||
C c = new C();
|
|
||||||
c.ageInt = "test";
|
|
||||||
a.c = c;
|
|
||||||
a.list = new ArrayList<>();
|
|
||||||
a.list.add(c);
|
|
||||||
Map<String, Object> underlineMap = getUnderlineMap(a, false, false);
|
|
||||||
System.out.println(JsonUtil.obj2Json(underlineMap));
|
|
||||||
}
|
}
|
||||||
|
boolean b = obj.getClass().isPrimitive()
|
||||||
static class A implements Serializable {
|
|| obj instanceof Integer || obj instanceof Character || obj instanceof Boolean
|
||||||
private static final long serialVersionUID = -8462118058721865488L;
|
|| obj instanceof Number || obj instanceof String || obj instanceof Double || obj instanceof Float
|
||||||
public String nameFirst;
|
|| obj instanceof Short || obj instanceof Long || obj instanceof Byte;
|
||||||
public String ageInt;
|
if (b) {
|
||||||
private String aM1;
|
return true;
|
||||||
@ToUeProperty("p_str")
|
|
||||||
protected String protectedStr;
|
|
||||||
|
|
||||||
public String getaM1() {
|
|
||||||
return aM1;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
public A setaM1(String aM1) {
|
|
||||||
this.aM1 = aM1;
|
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static class B extends A {
|
|
||||||
private static final long serialVersionUID = -8462118058721865488L;
|
|
||||||
public String testAss;
|
|
||||||
private String bM1;
|
|
||||||
private C c;
|
|
||||||
List<C> list;
|
|
||||||
|
|
||||||
public String getbM1() {
|
|
||||||
return bM1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public B setbM1(String bM1) {
|
|
||||||
this.bM1 = bM1;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static class C extends A {
|
|
||||||
private static final long serialVersionUID = -8462118058721865488L;
|
|
||||||
public String testAss;
|
|
||||||
private String bM1;
|
|
||||||
|
|
||||||
public String getbM1() {
|
|
||||||
return bM1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public C setbM1(String bM1) {
|
|
||||||
this.bM1 = bM1;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <h2>深度克隆对象</h2>
|
* <h2>深度克隆对象</h2>
|
||||||
@ -241,56 +258,4 @@ public class ObjUtil {
|
|||||||
return outer;
|
return outer;
|
||||||
}
|
}
|
||||||
|
|
||||||
// public static void main(String[] args) {
|
|
||||||
//// test1();
|
|
||||||
//// test2();
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private static void test2() {
|
|
||||||
// B t = new B();
|
|
||||||
// t.sex = "男";
|
|
||||||
// t.age = 18;
|
|
||||||
// A test = new A();
|
|
||||||
// test.name = "张三";
|
|
||||||
// t.test = test;
|
|
||||||
// B b = depthClone(t);
|
|
||||||
// System.out.println(JsonUtil.obj2Json(b));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// static class A implements Serializable {
|
|
||||||
// private static final long serialVersionUID = -8462118058721865488L;
|
|
||||||
// public String name;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// static class B implements Serializable {
|
|
||||||
// private static final long serialVersionUID = 3297717505428005316L;
|
|
||||||
// public int age;
|
|
||||||
// public String sex;
|
|
||||||
// public A test;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// static class C implements Serializable {
|
|
||||||
// private static final long serialVersionUID = 3297717505428005316L;
|
|
||||||
// public int age;
|
|
||||||
// public String sex;
|
|
||||||
// public A test;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private static void test1() {
|
|
||||||
// ApiVO apiVO = new ApiVO(ApiVO.STATUS.S);
|
|
||||||
// apiVO.setMsg("asdsadsad");
|
|
||||||
// apiVO.setObject1("sadsadsad");
|
|
||||||
//
|
|
||||||
// Resps<String> obj = new Resps<>();
|
|
||||||
// obj.setSucc("安达圣斗士", "ok");
|
|
||||||
// System.out.println(obj);
|
|
||||||
// apiVO.setObject2(obj);
|
|
||||||
// ApiVO apiVO1 = depthClone(apiVO);
|
|
||||||
// System.out.println(apiVO == apiVO1);
|
|
||||||
// System.out.println(JsonUtil.obj2Json(apiVO1));
|
|
||||||
// System.out.println(JsonUtil.obj2Json(apiVO1.getObject1(String.class)));
|
|
||||||
// System.out.println(JsonUtil.obj2Json(apiVO1.getObject2(Resps.class)));
|
|
||||||
// System.out.println(apiVO1.getObject2(Resps.class) == obj);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,11 @@ import java.util.regex.Pattern;
|
|||||||
/**
|
/**
|
||||||
* 正则验证
|
* 正则验证
|
||||||
*
|
*
|
||||||
* @author yexue
|
* @author maxf
|
||||||
* @expl
|
* @version 1.3.4
|
||||||
* @time 2017年11月9日 上午11:01:24
|
* @ClassName RegexUtil
|
||||||
|
* @Description
|
||||||
|
* @date 2019/1/3 9:33
|
||||||
*/
|
*/
|
||||||
public class RegexUtil {
|
public class RegexUtil {
|
||||||
private RegexUtil() {
|
private RegexUtil() {
|
||||||
|
@ -92,10 +92,10 @@ public final class StrUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成11位编号,可以用作订单号,有很小几率出现重复,需要做异常处理<br/>
|
* <p>生成11位编号,可以用作订单号,有很小几率出现重复,需要做异常处理</p>
|
||||||
* 左边第一位为正负标识:正数1 负数0<br/>
|
* <p>左边第一位为正负标识:正数1 负数0</p>
|
||||||
* 剩余位数为UUID的hashcode值<br/>
|
* <p> 剩余位数为UUID的hashcode值</p>
|
||||||
* 可以再生成的编号基础上嵌入其他标识编码
|
* <p>可以再生成的编号基础上嵌入其他标识编码</p>
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
@ -2,13 +2,48 @@ package com.yexuejc.base.util;
|
|||||||
|
|
||||||
import java.lang.annotation.*;
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* json转换时的格式指定
|
||||||
|
*
|
||||||
|
* @author: yexuejc
|
||||||
|
* @date: 2021-01-31 12:48:29
|
||||||
|
*/
|
||||||
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
|
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Documented
|
@Documented
|
||||||
public @interface ToUeProperty {
|
public @interface ToUeProperty {
|
||||||
/**
|
/**
|
||||||
* 字段名,默认该字段转下划线
|
* 字段名,默认该字段转下划线
|
||||||
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
String value() default "";
|
String value() default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否忽略该字段,默认false
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
boolean ignore() default false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换格式
|
||||||
|
* <p>目前只支持</p>
|
||||||
|
* <p> {@link java.util.Date}、{@link java.time.LocalDate}、{@link java.time.LocalDateTime}
|
||||||
|
* 转{@link Integer}(10位长度)、{@link Long}(13位长度)</p>
|
||||||
|
* 其余无效
|
||||||
|
*
|
||||||
|
* @return <pre>
|
||||||
|
* this in out <br/>
|
||||||
|
* {@link java.util.Date} {@link Integer} {@link Integer}10位长度时间戳<br/>
|
||||||
|
* {@link java.util.Date} {@link Long} {@link Long}13位长度时间戳<br/>
|
||||||
|
* {@link java.time.LocalDate} {@link Integer} {@link Integer}10位长度时间戳<br/>
|
||||||
|
* {@link java.time.LocalDate} {@link Long} {@link Long}13位长度时间戳(后三位为000)<br/>
|
||||||
|
* {@link java.time.LocalDateTime} {@link Integer} {@link Integer}10位长度时间戳<br/>
|
||||||
|
* {@link java.time.LocalDateTime} {@link Long} {@link Long}13位长度时间戳
|
||||||
|
*
|
||||||
|
* </pre>
|
||||||
|
*/
|
||||||
|
Class<?> type() default ObjUtil.class;
|
||||||
|
|
||||||
}
|
}
|
154
src/test/java/com/yexuejc/base/util/ObjUtilTest.java
Normal file
154
src/test/java/com/yexuejc/base/util/ObjUtilTest.java
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
package com.yexuejc.base.util;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* json化输出,改变属性名称,输出类型 {@link ObjUtil} + {@link ToUeProperty} 测试类
|
||||||
|
*
|
||||||
|
* @author: yexuejc
|
||||||
|
* @date: 2021-02-03 10:02:55
|
||||||
|
*/
|
||||||
|
class ObjUtilTest {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void start(){
|
||||||
|
B a = new B();
|
||||||
|
a.nameFirst = "张三";
|
||||||
|
a.ageInt = "5165458";
|
||||||
|
a.testAss = "asdasdsad";
|
||||||
|
a.setaM1("method1");
|
||||||
|
a.setbM1("b1Mthod1");
|
||||||
|
a.protectedStr = "protectedStr";
|
||||||
|
a.amount=new BigDecimal("3");
|
||||||
|
a.time = LocalDateTime.now();
|
||||||
|
a.dateTime=new Date();
|
||||||
|
C c = new C();
|
||||||
|
c.ageInt = "test";
|
||||||
|
a.c = c;
|
||||||
|
a.list = new ArrayList<>();
|
||||||
|
a.list.add(c);
|
||||||
|
Map<String, Object> underlineMap = ObjUtil.getUnderlineMap(a, false, false);
|
||||||
|
System.out.println(JsonUtil.formatPrinter(underlineMap));
|
||||||
|
}
|
||||||
|
|
||||||
|
static class A implements Serializable {
|
||||||
|
private static final long serialVersionUID = -8462118058721865488L;
|
||||||
|
public String nameFirst;
|
||||||
|
public String ageInt;
|
||||||
|
private String aM1;
|
||||||
|
@ToUeProperty("p_str")
|
||||||
|
protected String protectedStr;
|
||||||
|
|
||||||
|
public String getaM1() {
|
||||||
|
return aM1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public A setaM1(String aM1) {
|
||||||
|
this.aM1 = aM1;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class B extends A {
|
||||||
|
private static final long serialVersionUID = -8462118058721865488L;
|
||||||
|
public String testAss;
|
||||||
|
private String bM1;
|
||||||
|
|
||||||
|
@ToUeProperty(type = Integer.class)
|
||||||
|
public BigDecimal amount;
|
||||||
|
|
||||||
|
@ToUeProperty(type = String.class)
|
||||||
|
public LocalDateTime time;
|
||||||
|
|
||||||
|
public Date dateTime;
|
||||||
|
|
||||||
|
private C c;
|
||||||
|
List<C> list;
|
||||||
|
|
||||||
|
public String getbM1() {
|
||||||
|
return bM1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public B setbM1(String bM1) {
|
||||||
|
this.bM1 = bM1;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class C extends A {
|
||||||
|
private static final long serialVersionUID = -8462118058721865488L;
|
||||||
|
public String testAss;
|
||||||
|
private String bM1;
|
||||||
|
|
||||||
|
public String getbM1() {
|
||||||
|
return bM1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public C setbM1(String bM1) {
|
||||||
|
this.bM1 = bM1;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// public static void main(String[] args) {
|
||||||
|
//// test1();
|
||||||
|
//// test2();
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// private static void test2() {
|
||||||
|
// B t = new B();
|
||||||
|
// t.sex = "男";
|
||||||
|
// t.age = 18;
|
||||||
|
// A test = new A();
|
||||||
|
// test.name = "张三";
|
||||||
|
// t.test = test;
|
||||||
|
// B b = depthClone(t);
|
||||||
|
// System.out.println(JsonUtil.obj2Json(b));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// static class A implements Serializable {
|
||||||
|
// private static final long serialVersionUID = -8462118058721865488L;
|
||||||
|
// public String name;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// static class B implements Serializable {
|
||||||
|
// private static final long serialVersionUID = 3297717505428005316L;
|
||||||
|
// public int age;
|
||||||
|
// public String sex;
|
||||||
|
// public A test;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// static class C implements Serializable {
|
||||||
|
// private static final long serialVersionUID = 3297717505428005316L;
|
||||||
|
// public int age;
|
||||||
|
// public String sex;
|
||||||
|
// public A test;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// private static void test1() {
|
||||||
|
// ApiVO apiVO = new ApiVO(ApiVO.STATUS.S);
|
||||||
|
// apiVO.setMsg("asdsadsad");
|
||||||
|
// apiVO.setObject1("sadsadsad");
|
||||||
|
//
|
||||||
|
// Resps<String> obj = new Resps<>();
|
||||||
|
// obj.setSucc("安达圣斗士", "ok");
|
||||||
|
// System.out.println(obj);
|
||||||
|
// apiVO.setObject2(obj);
|
||||||
|
// ApiVO apiVO1 = depthClone(apiVO);
|
||||||
|
// System.out.println(apiVO == apiVO1);
|
||||||
|
// System.out.println(JsonUtil.obj2Json(apiVO1));
|
||||||
|
// System.out.println(JsonUtil.obj2Json(apiVO1.getObject1(String.class)));
|
||||||
|
// System.out.println(JsonUtil.obj2Json(apiVO1.getObject2(Resps.class)));
|
||||||
|
// System.out.println(apiVO1.getObject2(Resps.class) == obj);
|
||||||
|
// }
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user