mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
fix code
This commit is contained in:
parent
bd97a73cb9
commit
a6f01e75c6
@ -22,6 +22,7 @@ import org.dromara.hutool.core.reflect.TypeUtil;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@ -80,7 +81,8 @@ public class MapConverter implements Converter, Serializable {
|
|||||||
return (Map) value;
|
return (Map) value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
map = MapUtil.createMap(TypeUtil.getClass(targetType));
|
|
||||||
|
map = MapUtil.createMap(TypeUtil.getClass(targetType), LinkedHashMap::new);
|
||||||
convertMapToMap(keyType, valueType, (Map) value, map);
|
convertMapToMap(keyType, valueType, (Map) value, map);
|
||||||
} else if (BeanUtil.isBean(value.getClass())) {
|
} else if (BeanUtil.isBean(value.getClass())) {
|
||||||
map = BeanUtil.beanToMap(value);
|
map = BeanUtil.beanToMap(value);
|
||||||
|
@ -24,10 +24,7 @@ import org.dromara.hutool.core.util.ObjUtil;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.*;
|
||||||
import java.util.function.Function;
|
|
||||||
import java.util.function.Predicate;
|
|
||||||
import java.util.function.UnaryOperator;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -240,16 +237,30 @@ public class MapUtil extends MapGetUtil {
|
|||||||
* @param mapType map类型
|
* @param mapType map类型
|
||||||
* @return {@link Map}实例
|
* @return {@link Map}实例
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public static <K, V> Map<K, V> createMap(final Class<?> mapType) {
|
public static <K, V> Map<K, V> createMap(final Class<?> mapType) {
|
||||||
|
return createMap(mapType, HashMap::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建Map<br>
|
||||||
|
* 传入抽象Map{@link AbstractMap}和{@link Map}类将默认创建{@link HashMap}
|
||||||
|
*
|
||||||
|
* @param <K> map键类型
|
||||||
|
* @param <V> map值类型
|
||||||
|
* @param mapType map类型
|
||||||
|
* @param defaultMap 如果通过反射创建失败或提供的是抽象Map,则创建的默认Map
|
||||||
|
* @return {@link Map}实例
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <K, V> Map<K, V> createMap(final Class<?> mapType, final Supplier<Map<K, V>> defaultMap) {
|
||||||
if (null == mapType || mapType.isAssignableFrom(AbstractMap.class)) {
|
if (null == mapType || mapType.isAssignableFrom(AbstractMap.class)) {
|
||||||
return new HashMap<>();
|
return defaultMap.get();
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
return (Map<K, V>) ConstructorUtil.newInstance(mapType);
|
return (Map<K, V>) ConstructorUtil.newInstance(mapType);
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
// 不支持的map类型,返回默认的HashMap
|
// 不支持的map类型,返回默认的HashMap
|
||||||
return new HashMap<>();
|
return defaultMap.get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
45
hutool-core/src/test/java/org/dromara/hutool/core/data/Issue3081Test.java
Executable file
45
hutool-core/src/test/java/org/dromara/hutool/core/data/Issue3081Test.java
Executable file
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2023 looly(loolly@aliyun.com)
|
||||||
|
* Hutool is licensed under Mulan PSL v2.
|
||||||
|
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||||
|
* You may obtain a copy of Mulan PSL v2 at:
|
||||||
|
* http://license.coscl.org.cn/MulanPSL2
|
||||||
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||||
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||||
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the Mulan PSL v2 for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.dromara.hutool.core.data;
|
||||||
|
|
||||||
|
import org.dromara.hutool.core.date.DateField;
|
||||||
|
import org.dromara.hutool.core.date.DateRange;
|
||||||
|
import org.dromara.hutool.core.date.DateTime;
|
||||||
|
import org.dromara.hutool.core.date.DateUtil;
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Issue3081Test {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void dateRangeTest() {
|
||||||
|
final DateTime start = DateUtil.parse("2023-01-01 00:00:00");
|
||||||
|
final DateTime end = DateUtil.parse("2023-04-25 00:00:00");
|
||||||
|
|
||||||
|
final DateRange dateTimes = new DateRange(start, end, DateField.DAY_OF_MONTH, 30, true, true);
|
||||||
|
|
||||||
|
final List<DateTime> dateTimeList = new ArrayList<>();
|
||||||
|
while (dateTimes.hasNext()) {
|
||||||
|
dateTimeList.add(dateTimes.next());
|
||||||
|
}
|
||||||
|
Assertions.assertEquals(4, dateTimeList.size());
|
||||||
|
|
||||||
|
Assertions.assertEquals(DateUtil.parse("2023-01-01 00:00:00"), dateTimeList.get(0));
|
||||||
|
Assertions.assertEquals(DateUtil.parse("2023-01-31 00:00:00"), dateTimeList.get(1));
|
||||||
|
Assertions.assertEquals(DateUtil.parse("2023-03-02 00:00:00"), dateTimeList.get(2));
|
||||||
|
Assertions.assertEquals(DateUtil.parse("2023-04-01 00:00:00"), dateTimeList.get(3));
|
||||||
|
}
|
||||||
|
}
|
@ -33,7 +33,7 @@ public class ClientEngineFactory {
|
|||||||
* @return 单例的ClientEngine
|
* @return 单例的ClientEngine
|
||||||
*/
|
*/
|
||||||
public static ClientEngine getEngine() {
|
public static ClientEngine getEngine() {
|
||||||
return Singleton.get(ClientEngine.class.getName(), ClientEngineFactory::getEngine);
|
return Singleton.get(ClientEngine.class.getName(), ClientEngineFactory::createEngine);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -186,7 +186,15 @@ public class HtmlUtil {
|
|||||||
// [^>]+? 属性值,至少有一个非>的字符,>表示标签结束
|
// [^>]+? 属性值,至少有一个非>的字符,>表示标签结束
|
||||||
// \s+(?=>) 表示属性值后跟空格加>,即末尾的属性,此时去掉空格
|
// \s+(?=>) 表示属性值后跟空格加>,即末尾的属性,此时去掉空格
|
||||||
// (?=\s|>) 表示属性值后跟空格(属性后还有别的属性)或者跟>(最后一个属性)
|
// (?=\s|>) 表示属性值后跟空格(属性后还有别的属性)或者跟>(最后一个属性)
|
||||||
regex = StrUtil.format("(?i)(\\s*{}\\s*=[^>]+?\\s+(?=>))|(\\s*{}\\s*=[^>]+?(?=\\s|>))", attr, attr);
|
regex = StrUtil.format("(?i)(\\s*{}\\s*=\\s*)" +
|
||||||
|
"(" +
|
||||||
|
// name="xxxx"
|
||||||
|
"([\"][^\"]+?[\"]\\s*)|" +
|
||||||
|
// name=xxx >
|
||||||
|
"([^>]+?\\s+(?=>))|" +
|
||||||
|
// name=xxx> 或者 name=xxx name2=xxx
|
||||||
|
"([^>]+?(?=\\s|>))" +
|
||||||
|
")", attr);
|
||||||
content = content.replaceAll(regex, StrUtil.EMPTY);
|
content = content.replaceAll(regex, StrUtil.EMPTY);
|
||||||
}
|
}
|
||||||
return content;
|
return content;
|
||||||
|
@ -199,4 +199,15 @@ public class HtmlUtilTest {
|
|||||||
charsetName = ReUtil.get(HtmlUtil.META_CHARSET_PATTERN, "<meta charset = \"utf-8\"", 1);
|
charsetName = ReUtil.get(HtmlUtil.META_CHARSET_PATTERN, "<meta charset = \"utf-8\"", 1);
|
||||||
Assertions.assertEquals("utf-8", charsetName);
|
Assertions.assertEquals("utf-8", charsetName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void issueI6YNTFTest() {
|
||||||
|
String html = "<html><body><div class=\"a1 a2\">hello world</div></body></html>";
|
||||||
|
String cleanText = HtmlUtil.removeHtmlAttr(html,"class");
|
||||||
|
Assertions.assertEquals("<html><body><div>hello world</div></body></html>", cleanText);
|
||||||
|
|
||||||
|
html = "<html><body><div class=a1>hello world</div></body></html>";
|
||||||
|
cleanText = HtmlUtil.removeHtmlAttr(html,"class");
|
||||||
|
Assertions.assertEquals("<html><body><div>hello world</div></body></html>", cleanText);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
46
hutool-json/src/test/java/org/dromara/hutool/json/IssueI6YN2ATest.java
Executable file
46
hutool-json/src/test/java/org/dromara/hutool/json/IssueI6YN2ATest.java
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2023 looly(loolly@aliyun.com)
|
||||||
|
* Hutool is licensed under Mulan PSL v2.
|
||||||
|
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||||
|
* You may obtain a copy of Mulan PSL v2 at:
|
||||||
|
* http://license.coscl.org.cn/MulanPSL2
|
||||||
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||||
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||||
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the Mulan PSL v2 for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.dromara.hutool.json;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.dromara.hutool.core.reflect.TypeReference;
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class IssueI6YN2ATest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void toBeanTest() {
|
||||||
|
final String str = "{\"conditions\":{\"user\":\"test\",\"sex\":\"男\"}," +
|
||||||
|
"\"headers\":{\"name\":\"姓名\",\"age\":\"年龄\",\"email\":\"邮箱\",\"number\":\"号码\",\"pwd\":\"密码\"}}";
|
||||||
|
final JSONObject jsonObject = JSONUtil.parseObj(str);
|
||||||
|
|
||||||
|
final PageQuery<User> bean = jsonObject.toBean(new TypeReference<PageQuery<User>>() {});
|
||||||
|
Assertions.assertEquals("{name=姓名, age=年龄, email=邮箱, number=号码, pwd=密码}", bean.headers.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class PageQuery<T> {
|
||||||
|
private Map<String, String> headers = new LinkedHashMap<>();
|
||||||
|
private T conditions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class User {
|
||||||
|
private String name;
|
||||||
|
private String sex;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user