為什么不推薦使用BeanUtils屬性轉(zhuǎn)換工具
1、【建議收藏】面試官會問的位運(yùn)算奇淫技巧 2、Top 16 的 Java 工具類,你用過幾個? 3、到底可不可以用 kill -9 關(guān)閉程序? 4、IDEA 2021首個大版本發(fā)布,新增了這幾個超實(shí)用功能! 5、Optional 是個好東西,你真的會用么?
1、背景
2、示例
import lombok.Data;
import java.util.List;
@Data
public class A {
private String name;
private List<Integer> ids;
}
@Data
public class B {
private String name;
private List<String> ids;
}
import org.springframework.beans.BeanUtils;
import java.util.Arrays;
public class BeanUtilDemo {
public static void main(String[] args) {
A first = new A();
first.setName("demo");
first.setIds(Arrays.asList(1, 2, 3));
B second = new B();
BeanUtils.copyProperties(first, second);
for (String each : second.getIds()) {// 類型轉(zhuǎn)換異常
System.out.println(each);
}
}
}

import org.easymock.cglib.beans.BeanCopier;
import java.util.Arrays;
public class BeanUtilDemo {
public static void main(String[] args) {
A first = new A();
first.setName("demo");
first.setIds(Arrays.asList(1, 2, 3));
B second = new B();
final BeanCopier beanCopier = BeanCopier.create(A.class, B.class, false);
beanCopier.copy(first,second,null);
for (String each : second.getIds()) {// 類型轉(zhuǎn)換異常
System.out.println(each);
}
}
}
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface Converter {
Converter INSTANCE = Mappers.getMapper(Converter.class);
B aToB(A car);
}
import java.util.Arrays;
public class BeanUtilDemo {
public static void main(String[] args) {
A first = new A();
first.setName("demo");
first.setIds(Arrays.asList(1, 2, 3));
B second = Converter.INSTANCE.aToB(first);
for (String each : second.getIds()) {// 正常
System.out.println(each);
}
}
}
List<Integer> 轉(zhuǎn)為 B 中的 List<String> 類型。import java.util.ArrayList;
import java.util.List;
import javax.annotation.Generated;
import org.springframework.stereotype.Component;
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_202 (Oracle Corporation)"
)
@Component
public class ConverterImpl implements Converter {
@Override
public B aToB(A car) {
if ( car == null ) {
return null;
}
B b = new B();
b.setName( car.getName() );
b.setIds( integerListToStringList( car.getIds() ) );
return b;
}
protected List<String> integerListToStringList(List<Integer> list) {
if ( list == null ) {
return null;
}
List<String> list1 = new ArrayList<String>( list.size() );
for ( Integer integer : list ) {
list1.add( String.valueOf( integer ) );
}
return list1;
}
}
.NumberFormatException。@Override
public B aToB(A car) {
if ( car == null ) {
return null;
}
B b = new B();
b.setName( car.getName() );
if ( car.getNumber() != null ) { // 問題出在這里
b.setNumber( Long.parseLong( car.getNumber() ) );
}
b.setIds( integerListToStringList( car.getIds() ) );
return b;
}
public final class A2BConverter {
public static B from(A first) {
B b = new B();
b.setName(first.getName());
b.setIds(first.getIds());
return b;
}
}

List<Integer> 和 List<String> 都是 List 類型,可以正常賦值。這就導(dǎo)致在使用很多屬性映射工具時,編譯時不容易明顯的錯誤。
往期熱門文章:
1、《歷史文章分類導(dǎo)讀列表!精選優(yōu)秀博文都在這里了!》
2、七種方式教你在Spring Boot初始化時搞點(diǎn)事情
3、ConcurrentHashMap有十個提升性能的地方,你都知道嗎? 4、程序員等級圖鑒 5、Java 中的 Switch 都支持 String 了,為什么不支持 long? 6、為什么數(shù)據(jù)庫字段要使用NOT NULL? 7、CTO 說了,用錯 @Autowired 和 @Resource 的人可以領(lǐng)盒飯了 8、程序員離職事件始末
9、別總寫代碼,這130個網(wǎng)站比漲工資都重要 10、程序員養(yǎng)生指北
評論
圖片
表情
