Skip to content

Commit 3d10a39

Browse files
committed
修复NumberWithFormat导致转换Long异常问题
1 parent 11e3d7a commit 3d10a39

File tree

6 files changed

+51
-25
lines changed

6 files changed

+51
-25
lines changed

CHANGELOG.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
# 🚀Changelog
33

44
-------------------------------------------------------------------------------------------------------------
5-
# 5.8.15.M1 (2023-03-07)
5+
# 5.8.15.M1 (2023-03-08)
66

77
### 🐣新特性
8-
* 【all 】 修复Automatic-Module-Name错误问题(issue#2952@Github)
9-
108
### 🐞Bug修复
9+
* 【all 】 修复Automatic-Module-Name错误问题(issue#2952@Github)
10+
* 【all 】 修复NumberWithFormat导致转换Long异常问题(issue#I6L2LO@Gitee)
1111

1212
-------------------------------------------------------------------------------------------------------------
1313

hutool-core/src/main/java/cn/hutool/core/convert/NumberWithFormat.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* @since 5.8.13
1515
*/
1616
public class NumberWithFormat extends Number implements TypeConverter{
17+
private static final long serialVersionUID = 1L;
1718

1819
private final Number number;
1920
private final String format;
@@ -31,7 +32,8 @@ public NumberWithFormat(final Number number, final String format) {
3132
@SuppressWarnings("unchecked")
3233
@Override
3334
public Object convert(Type targetType, Object value) {
34-
if (targetType instanceof Class) {
35+
// 自定义日期格式
36+
if (null != this.format && targetType instanceof Class) {
3537
final Class<?> clazz = (Class<?>) targetType;
3638
// https://gitee.com/dromara/hutool/issues/I6IS5B
3739
if (Date.class.isAssignableFrom(clazz)) {
@@ -41,8 +43,12 @@ public Object convert(Type targetType, Object value) {
4143
} else if(String.class == clazz){
4244
return toString();
4345
}
46+
47+
// 其他情况按照正常数字转换
4448
}
45-
throw new ConvertException("Unsupported target type {}", targetType);
49+
50+
// 按照正常数字转换
51+
return Convert.convertWithCheck(targetType, this.number, null, false);
4652
}
4753

4854
@Override

hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ public class NumberConverter extends AbstractConverter<Number> {
4141

4242
private final Class<? extends Number> targetType;
4343

44+
/**
45+
* 构造
46+
*/
4447
public NumberConverter() {
4548
this.targetType = Number.class;
4649
}
@@ -67,7 +70,7 @@ protected Number convertInternal(Object value) {
6770

6871
@Override
6972
protected String convertToStr(Object value) {
70-
String result = StrUtil.trim(super.convertToStr(value));
73+
final String result = StrUtil.trim(super.convertToStr(value));
7174
if (null != result && result.length() > 1) {
7275
final char c = Character.toUpperCase(result.charAt(result.length() - 1));
7376
if (c == 'D' || c == 'L' || c == 'F') {

hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromStringGetter.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package cn.hutool.core.getter;
22

3+
import cn.hutool.core.convert.Convert;
4+
35
import java.math.BigDecimal;
46
import java.math.BigInteger;
57
import java.util.Date;
68

7-
import cn.hutool.core.convert.Convert;
8-
99
/**
1010
* 基本类型的getter接口抽象实现,所有类型的值获取都是通过将String转换而来<br>
1111
* 用户只需实现getStr方法即可,其他类型将会从String结果中转换 在不提供默认值的情况下, 如果值不存在或获取错误,返回null<br>

hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java

+8-7
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,7 @@
1717
import java.math.BigDecimal;
1818
import java.time.LocalDate;
1919
import java.time.LocalDateTime;
20-
import java.util.ArrayList;
21-
import java.util.Arrays;
22-
import java.util.Date;
23-
import java.util.Hashtable;
24-
import java.util.List;
25-
import java.util.Map;
26-
import java.util.Set;
20+
import java.util.*;
2721
import java.util.concurrent.atomic.AtomicIntegerArray;
2822
import java.util.concurrent.atomic.AtomicLongArray;
2923
import java.util.concurrent.atomic.DoubleAdder;
@@ -143,6 +137,13 @@ public void toLongTest() {
143137
Assert.assertEquals(8, dLong2);
144138
}
145139

140+
@Test
141+
public void toLongFromNumberWithFormatTest() {
142+
final NumberWithFormat value = new NumberWithFormat(1678285713935L, null);
143+
final Long aLong = Convert.convertWithCheck(Long.class, value, null, false);
144+
Assert.assertEquals(new Long(1678285713935L), aLong);
145+
}
146+
146147
@Test
147148
public void toCharTest() {
148149
final String str = "aadfdsfs";

hutool-jwt/src/test/java/cn/hutool/jwt/JWTTest.java

+26-10
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,27 @@ public class JWTTest {
1010

1111
@Test
1212
public void createHs256Test(){
13-
byte[] key = "1234567890".getBytes();
14-
JWT jwt = JWT.create()
13+
final byte[] key = "1234567890".getBytes();
14+
final JWT jwt = JWT.create()
1515
.setPayload("sub", "1234567890")
1616
.setPayload("name", "looly")
1717
.setPayload("admin", true)
1818
.setExpiresAt(DateUtil.parse("2022-01-01"))
1919
.setKey(key);
2020

21-
String rightToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9." +
21+
final String rightToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9." +
2222
"eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Imxvb2x5IiwiYWRtaW4iOnRydWUsImV4cCI6MTY0MDk2NjQwMH0." +
2323
"bXlSnqVeJXWqUIt7HyEhgKNVlIPjkumHlAwFY-5YCtk";
2424

25-
String token = jwt.sign();
25+
final String token = jwt.sign();
2626
Assert.assertEquals(rightToken, token);
2727

2828
Assert.assertTrue(JWT.of(rightToken).setKey(key).verify());
2929
}
3030

3131
@Test
3232
public void parseTest(){
33-
String rightToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9." +
33+
final String rightToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9." +
3434
"eyJzdWIiOiIxMjM0NTY3ODkwIiwiYWRtaW4iOnRydWUsIm5hbWUiOiJsb29seSJ9." +
3535
"U2aQkC2THYV9L0fTN-yBBI7gmo5xhmvMhATtu8v0zEA";
3636

@@ -51,16 +51,16 @@ public void parseTest(){
5151

5252
@Test
5353
public void createNoneTest(){
54-
JWT jwt = JWT.create()
54+
final JWT jwt = JWT.create()
5555
.setPayload("sub", "1234567890")
5656
.setPayload("name", "looly")
5757
.setPayload("admin", true)
5858
.setSigner(JWTSignerUtil.none());
5959

60-
String rightToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9." +
60+
final String rightToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9." +
6161
"eyJzdWIiOiIxMjM0NTY3ODkwIiwiYWRtaW4iOnRydWUsIm5hbWUiOiJsb29seSJ9.";
6262

63-
String token = jwt.sign();
63+
final String token = jwt.sign();
6464
Assert.assertEquals(token, token);
6565

6666
Assert.assertTrue(JWT.of(rightToken).setSigner(JWTSignerUtil.none()).verify());
@@ -71,7 +71,7 @@ public void createNoneTest(){
7171
*/
7272
@Test(expected = JWTException.class)
7373
public void needSignerTest(){
74-
JWT jwt = JWT.create()
74+
final JWT jwt = JWT.create()
7575
.setPayload("sub", "1234567890")
7676
.setPayload("name", "looly")
7777
.setPayload("admin", true);
@@ -81,11 +81,27 @@ public void needSignerTest(){
8181

8282
@Test
8383
public void verifyTest(){
84-
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9." +
84+
final String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9." +
8585
"eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE2MjQwMDQ4MjIsInVzZXJJZCI6MSwiYXV0aG9yaXRpZXMiOlsiUk9MRV_op5LoibLkuozlj7ciLCJzeXNfbWVudV8xIiwiUk9MRV_op5LoibLkuIDlj7ciLCJzeXNfbWVudV8yIl0sImp0aSI6ImQ0YzVlYjgwLTA5ZTctNGU0ZC1hZTg3LTVkNGI5M2FhNmFiNiIsImNsaWVudF9pZCI6ImhhbmR5LXNob3AifQ." +
8686
"aixF1eKlAKS_k3ynFnStE7-IRGiD5YaqznvK2xEjBew";
8787

8888
final boolean verify = JWT.of(token).setKey(StrUtil.utf8Bytes("123456")).verify();
8989
Assert.assertTrue(verify);
9090
}
91+
92+
@Test
93+
public void getLongTest(){
94+
final String rightToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"
95+
+ ".eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJhZG1pbiIsImRldmljZSI6ImRlZmF1bHQtZGV2aWNlIiwiZWZmIjoxNjc4Mjg1NzEzOTM1LCJyblN0ciI6IkVuMTczWFhvWUNaaVZUWFNGOTNsN1pabGtOalNTd0pmIn0"
96+
+ ".wRe2soTaWYPhwcjxdzesDi1BgEm9D61K-mMT3fPc4YM"
97+
+ "";
98+
99+
final JWT jwt = JWTUtil.parseToken(rightToken);
100+
101+
Assert.assertEquals(
102+
"{\"loginType\":\"login\",\"loginId\":\"admin\",\"device\":\"default-device\"," +
103+
"\"eff\":1678285713935,\"rnStr\":\"En173XXoYCZiVTXSF93l7ZZlkNjSSwJf\"}",
104+
jwt.getPayloads().toString());
105+
Assert.assertEquals(Long.valueOf(1678285713935L), jwt.getPayloads().getLong("eff"));
106+
}
91107
}

0 commit comments

Comments
 (0)