diff --git a/hippo4j-common/pom.xml b/hippo4j-common/pom.xml index a9c47599..320c0fba 100644 --- a/hippo4j-common/pom.xml +++ b/hippo4j-common/pom.xml @@ -71,6 +71,11 @@ com.github.ben-manes.caffeine caffeine + + + com.github.dozermapper + dozer-core + diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/toolkit/BeanUtil.java b/hippo4j-common/src/main/java/cn/hippo4j/common/toolkit/BeanUtil.java index 0459027b..e654f091 100644 --- a/hippo4j-common/src/main/java/cn/hippo4j/common/toolkit/BeanUtil.java +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/toolkit/BeanUtil.java @@ -18,6 +18,8 @@ package cn.hippo4j.common.toolkit; import cn.hippo4j.common.web.exception.IllegalException; +import com.github.dozermapper.core.DozerBeanMapperBuilder; +import com.github.dozermapper.core.Mapper; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.springframework.beans.BeanUtils; @@ -25,7 +27,7 @@ import org.springframework.beans.BeanUtils; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; -import java.util.Map; +import java.util.*; /** * Bean util. @@ -33,6 +35,40 @@ import java.util.Map; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class BeanUtil { + protected static Mapper BEAN_MAPPER_BUILDER; + + static { + BEAN_MAPPER_BUILDER = DozerBeanMapperBuilder.buildDefault(); + } + + public static T convert(S source, Class clazz) { + return Optional.ofNullable(source) + .map(each -> BEAN_MAPPER_BUILDER.map(each, clazz)) + .orElse(null); + } + + public static List convert(List sources, Class clazz) { + return Optional.ofNullable(sources) + .map(each -> { + List targetList = new ArrayList(each.size()); + each.stream() + .forEach(item -> targetList.add(BEAN_MAPPER_BUILDER.map(item, clazz))); + return targetList; + }) + .orElse(null); + } + + public static Set convert(Set sources, Class clazz) { + return Optional.ofNullable(sources) + .map(each -> { + Set targetSize = new HashSet(each.size()); + each.stream() + .forEach(item -> targetSize.add(BEAN_MAPPER_BUILDER.map(item, clazz))); + return targetSize; + }) + .orElse(null); + } + /** * copyProperties * diff --git a/hippo4j-common/src/test/java/cn/hippo4j/common/toolkit/BeanUtilTest.java b/hippo4j-common/src/test/java/cn/hippo4j/common/toolkit/BeanUtilTest.java index c24c4a42..4ecf14df 100644 --- a/hippo4j-common/src/test/java/cn/hippo4j/common/toolkit/BeanUtilTest.java +++ b/hippo4j-common/src/test/java/cn/hippo4j/common/toolkit/BeanUtilTest.java @@ -17,19 +17,94 @@ package cn.hippo4j.common.toolkit; -import lombok.Getter; -import lombok.Setter; +import com.github.dozermapper.core.converters.ConversionException; +import lombok.*; import org.junit.Assert; import org.junit.Test; import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; +import java.util.*; public class BeanUtilTest { + + @Test + public void beanToMapConvertTest() { + // 测试BeanToMap + final Person person = new Person(); + person.setName("Hippo4j"); + person.setAge(1); + person.setAddress("hippo4j.cn"); + person.setSize(999); + final Map convert = BeanUtil.convert(person, Map.class); + Assert.assertEquals("Hippo4j", convert.get("name")); + Assert.assertEquals(1, convert.get("age")); + Assert.assertEquals("hippo4j.cn", convert.get("address")); + Assert.assertEquals(999, convert.get("size")); + } + + @Test + public void mapToBeanConvertTest() { + // 测试MapToBean + final HashMap map = new HashMap<>(); + map.put("name", "Hippo4j"); + map.put("age", 1); + map.put("address", "hippo4j.cn"); + map.put("size", 999); + final Person person = BeanUtil.convert(map, Person.class); + Assert.assertEquals("Hippo4j", person.getName()); + Assert.assertEquals(1, person.getAge()); + Assert.assertEquals("hippo4j.cn", person.getAddress()); + Assert.assertEquals(999, (int) person.getSize()); + } + + @Test + public void ListToListConvertTest() { + final List list = new ArrayList<>(); + list.add(Person.builder().name("one").age(1).build()); + list.add(Person.builder().name("two").age(2).build()); + list.add(Person.builder().name("three").age(3).build()); + + final List persons = BeanUtil.convert(list, PersonVo.class); + Assert.assertEquals(list.size(), persons.size()); + } + @Test + public void SetToSetConvertTest() { + final Set sets = new HashSet<>(); + sets.add(Person.builder().name("one").age(1).build()); + sets.add(Person.builder().name("two").age(2).build()); + sets.add(Person.builder().name("three").age(3).build()); + + final Set persons = BeanUtil.convert(sets, PersonVo.class); + Assert.assertEquals(sets.size(), persons.size()); + } + + @Test + public void copyPropertiesBeanToMapTest() { + // 测试BeanToMap + final Person person = new Person(); + person.setName("Hippo4j"); + + final Map convert = BeanUtil.convert(person, Map.class); + Assert.assertEquals("Hippo4j", convert.get("name")); + + // static属性应被忽略 + Assert.assertFalse(convert.containsKey("STATIC_NAME")); + } + + /** + * 测试在不忽略错误情况下,转换失败需要报错。 + */ + @Test(expected = ConversionException.class) + public void mapToBeanWinErrorTest() { + final Map map = new HashMap<>(); + map.put("age", "Hippo4j"); + BeanUtil.convert(map, Person.class); + } + + // ----------------------------------------------------------------------------------------------------------------- + public void testMapToBean() { Map map = new HashMap<>(); map.put("name", "Test"); @@ -51,14 +126,34 @@ public class BeanUtilTest { Assert.assertEquals("setName", name.getName()); } + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class Person { + + public static final String STATIC_NAME = "STATIC_NAME"; + + private String name; + private int age; + private String address; + private Integer size; + } + + @Setter + public static class PersonVo { + + private String name; + private int age; + } + @Getter @Setter static class Customer { String name; - Integer status; - } @Getter @@ -66,8 +161,6 @@ public class BeanUtilTest { static class PreCustomer { String name; - Integer status; - } } diff --git a/hippo4j-config/pom.xml b/hippo4j-config/pom.xml index 52640adf..e999ccdd 100644 --- a/hippo4j-config/pom.xml +++ b/hippo4j-config/pom.xml @@ -49,17 +49,6 @@ runtime - - cn.hippo4j - hippo4j-common - ${revision} - - - - com.github.dozermapper - dozer-core - - org.projectlombok lombok diff --git a/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ConfigServiceImpl.java b/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ConfigServiceImpl.java index 49e5e0d3..bf70a5b9 100644 --- a/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ConfigServiceImpl.java +++ b/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ConfigServiceImpl.java @@ -35,7 +35,7 @@ import cn.hippo4j.config.model.biz.notify.NotifyReqDTO; import cn.hippo4j.config.service.ConfigCacheService; import cn.hippo4j.config.service.ConfigChangePublisher; import cn.hippo4j.config.service.biz.*; -import cn.hippo4j.config.toolkit.BeanUtil; +import cn.hippo4j.common.toolkit.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; diff --git a/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/HisRunDataServiceImpl.java b/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/HisRunDataServiceImpl.java index 2d2f593d..1c4c93af 100644 --- a/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/HisRunDataServiceImpl.java +++ b/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/HisRunDataServiceImpl.java @@ -33,7 +33,7 @@ import cn.hippo4j.config.model.biz.monitor.MonitorQueryReqDTO; import cn.hippo4j.config.model.biz.monitor.MonitorRespDTO; import cn.hippo4j.config.monitor.QueryMonitorExecuteChoose; import cn.hippo4j.config.service.biz.HisRunDataService; -import cn.hippo4j.config.toolkit.BeanUtil; +import cn.hippo4j.common.toolkit.BeanUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; diff --git a/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ItemServiceImpl.java b/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ItemServiceImpl.java index 959955c5..b2966cdf 100644 --- a/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ItemServiceImpl.java +++ b/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ItemServiceImpl.java @@ -28,7 +28,7 @@ import cn.hippo4j.config.model.biz.item.ItemUpdateReqDTO; import cn.hippo4j.config.model.biz.threadpool.ThreadPoolRespDTO; import cn.hippo4j.config.service.biz.ItemService; import cn.hippo4j.config.service.biz.ThreadPoolService; -import cn.hippo4j.config.toolkit.BeanUtil; +import cn.hippo4j.common.toolkit.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; diff --git a/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/NotifyServiceImpl.java b/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/NotifyServiceImpl.java index 7b9c6685..5696cb0c 100644 --- a/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/NotifyServiceImpl.java +++ b/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/NotifyServiceImpl.java @@ -30,7 +30,7 @@ import cn.hippo4j.config.model.biz.notify.NotifyQueryReqDTO; import cn.hippo4j.config.model.biz.notify.NotifyReqDTO; import cn.hippo4j.config.model.biz.notify.NotifyRespDTO; import cn.hippo4j.config.service.biz.NotifyService; -import cn.hippo4j.config.toolkit.BeanUtil; +import cn.hippo4j.common.toolkit.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; diff --git a/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/OperationLogServiceImpl.java b/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/OperationLogServiceImpl.java index eee236bd..7cadd49e 100644 --- a/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/OperationLogServiceImpl.java +++ b/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/OperationLogServiceImpl.java @@ -23,7 +23,7 @@ import cn.hippo4j.config.model.LogRecordInfo; import cn.hippo4j.config.model.biz.log.LogRecordQueryReqDTO; import cn.hippo4j.config.model.biz.log.LogRecordRespDTO; import cn.hippo4j.config.service.biz.OperationLogService; -import cn.hippo4j.config.toolkit.BeanUtil; +import cn.hippo4j.common.toolkit.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; diff --git a/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/TenantServiceImpl.java b/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/TenantServiceImpl.java index f3a0baa6..1945562d 100644 --- a/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/TenantServiceImpl.java +++ b/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/TenantServiceImpl.java @@ -29,7 +29,7 @@ import cn.hippo4j.config.model.biz.tenant.TenantSaveReqDTO; import cn.hippo4j.config.model.biz.tenant.TenantUpdateReqDTO; import cn.hippo4j.config.service.biz.ItemService; import cn.hippo4j.config.service.biz.TenantService; -import cn.hippo4j.config.toolkit.BeanUtil; +import cn.hippo4j.common.toolkit.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; diff --git a/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ThreadPoolServiceImpl.java b/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ThreadPoolServiceImpl.java index b26016b9..8c58e935 100644 --- a/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ThreadPoolServiceImpl.java +++ b/hippo4j-config/src/main/java/cn/hippo4j/config/service/biz/impl/ThreadPoolServiceImpl.java @@ -30,7 +30,7 @@ import cn.hippo4j.config.model.biz.threadpool.ThreadPoolSaveOrUpdateReqDTO; import cn.hippo4j.config.service.biz.ConfigService; import cn.hippo4j.config.service.biz.OperationLogService; import cn.hippo4j.config.service.biz.ThreadPoolService; -import cn.hippo4j.config.toolkit.BeanUtil; +import cn.hippo4j.common.toolkit.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.StringUtils; diff --git a/hippo4j-config/src/main/java/cn/hippo4j/config/toolkit/BeanUtil.java b/hippo4j-config/src/main/java/cn/hippo4j/config/toolkit/BeanUtil.java deleted file mode 100644 index ad4c3879..00000000 --- a/hippo4j-config/src/main/java/cn/hippo4j/config/toolkit/BeanUtil.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.toolkit; - -import com.github.dozermapper.core.DozerBeanMapperBuilder; -import com.github.dozermapper.core.Mapper; - -import java.util.*; - -/** - * Bean util. - */ -public class BeanUtil { - - private BeanUtil() { - - } - - protected static Mapper BEAN_MAPPER_BUILDER; - - static { - BEAN_MAPPER_BUILDER = DozerBeanMapperBuilder.buildDefault(); - } - - public static T convert(S source, Class clazz) { - return Optional.ofNullable(source) - .map(each -> BEAN_MAPPER_BUILDER.map(each, clazz)) - .orElse(null); - } - - public static List convert(List sources, Class clazz) { - return Optional.ofNullable(sources) - .map(each -> { - List targetList = new ArrayList(each.size()); - each.stream() - .forEach(item -> targetList.add(BEAN_MAPPER_BUILDER.map(item, clazz))); - return targetList; - }) - .orElse(null); - } - - public static Set convert(Set sources, Class clazz) { - return Optional.ofNullable(sources) - .map(each -> { - Set targetSize = new HashSet(each.size()); - each.stream() - .forEach(item -> targetSize.add(BEAN_MAPPER_BUILDER.map(item, clazz))); - return targetSize; - }) - .orElse(null); - } -} diff --git a/hippo4j-config/src/test/java/cn/hippo4j/config/toolkit/BeanUtilTest.java b/hippo4j-config/src/test/java/cn/hippo4j/config/toolkit/BeanUtilTest.java deleted file mode 100644 index 2c393a03..00000000 --- a/hippo4j-config/src/test/java/cn/hippo4j/config/toolkit/BeanUtilTest.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.hippo4j.config.toolkit; - -import cn.hippo4j.common.toolkit.Assert; -import com.github.dozermapper.core.converters.ConversionException; -import lombok.*; -import org.junit.Test; - -import java.util.*; - -/** - * BeanUtil Test - */ -public class BeanUtilTest { - - @Test - public void beanToMapConvertTest() { - // 测试BeanToMap - final Person person = new Person(); - person.setName("Hippo4j"); - person.setAge(1); - person.setAddress("hippo4j.cn"); - person.setSize(999); - final Map convert = BeanUtil.convert(person, Map.class); - Assert.isTrue(Objects.equals("Hippo4j", convert.get("name"))); - Assert.isTrue(Objects.equals(1, convert.get("age"))); - Assert.isTrue(Objects.equals("hippo4j.cn", convert.get("address"))); - Assert.isTrue(Objects.equals(999, convert.get("size"))); - } - - @Test - public void mapToBeanConvertTest() { - // 测试MapToBean - final HashMap map = new HashMap<>(); - map.put("name", "Hippo4j"); - map.put("age", 1); - map.put("address", "hippo4j.cn"); - map.put("size", 999); - final Person person = BeanUtil.convert(map, Person.class); - Assert.isTrue(Objects.equals("Hippo4j", person.getName())); - Assert.isTrue(Objects.equals(1, person.getAge())); - Assert.isTrue(Objects.equals("hippo4j.cn", person.getAddress())); - Assert.isTrue(Objects.equals(999, person.getSize())); - } - - @Test - public void ListToListConvertTest() { - final List list = new ArrayList<>(); - list.add(Person.builder().name("one").age(1).build()); - list.add(Person.builder().name("two").age(2).build()); - list.add(Person.builder().name("three").age(3).build()); - - final List persons = BeanUtil.convert(list, PersonVo.class); - Assert.isTrue(Objects.equals(list.size(), persons.size())); - } - - @Test - public void SetToSetConvertTest() { - final Set sets = new HashSet<>(); - sets.add(Person.builder().name("one").age(1).build()); - sets.add(Person.builder().name("two").age(2).build()); - sets.add(Person.builder().name("three").age(3).build()); - - final Set persons = BeanUtil.convert(sets, PersonVo.class); - Assert.isTrue(Objects.equals(sets.size(), persons.size())); - } - - @Test - public void copyPropertiesBeanToMapTest() { - // 测试BeanToMap - final Person person = new Person(); - person.setName("Hippo4j"); - - final Map convert = BeanUtil.convert(person, Map.class); - Assert.isTrue(Objects.equals("Hippo4j", convert.get("name"))); - - // static属性应被忽略 - Assert.isTrue(!convert.containsKey("STATIC_NAME")); - } - - /** - * 测试在不忽略错误情况下,转换失败需要报错。 - */ - @Test(expected = ConversionException.class) - public void mapToBeanWinErrorTest() { - final Map map = new HashMap<>(); - map.put("age", "Hippo4j"); - BeanUtil.convert(map, Person.class); - } - - // ----------------------------------------------------------------------------------------------------------------- - - @Getter - @Setter - @Builder - @AllArgsConstructor - @NoArgsConstructor - public static class Person { - - public static final String STATIC_NAME = "STATIC_NAME"; - - private String name; - private int age; - private String address; - private Integer size; - } - - @Setter - public static class PersonVo { - - private String name; - private int age; - } -} diff --git a/hippo4j-console/src/main/java/cn/hippo4j/console/controller/ThreadPoolController.java b/hippo4j-console/src/main/java/cn/hippo4j/console/controller/ThreadPoolController.java index a2f6acdb..f0da644b 100644 --- a/hippo4j-console/src/main/java/cn/hippo4j/console/controller/ThreadPoolController.java +++ b/hippo4j-console/src/main/java/cn/hippo4j/console/controller/ThreadPoolController.java @@ -32,7 +32,7 @@ import cn.hippo4j.config.model.biz.threadpool.ThreadPoolRespDTO; import cn.hippo4j.config.model.biz.threadpool.ThreadPoolSaveOrUpdateReqDTO; import cn.hippo4j.config.service.ConfigCacheService; import cn.hippo4j.config.service.biz.ThreadPoolService; -import cn.hippo4j.config.toolkit.BeanUtil; +import cn.hippo4j.common.toolkit.BeanUtil; import cn.hippo4j.console.model.ThreadPoolInstanceInfo; import cn.hippo4j.console.model.WebThreadPoolReqDTO; import cn.hippo4j.console.model.WebThreadPoolRespDTO;