2013-09-28 3 views
0

DTO объекта:несоответствие типов с помощью BeanUtils.copyProperties

public class DTOUser implements UserDetails { 
/** 
* 
*/ 
private static final long serialVersionUID = -769714837633005963L; 
private Long id; 
private String account; 
private String password; 
private String statusStr; 
private UserStatus status; 
private int systemAdmin; 
private long operator; 
private String operateTime; 
private String name; 
private String company; 
private String email; 
private String telephone; 
private List<DTOAuthority> dtoAuthorities = new ArrayList<DTOAuthority>(); 
private List<DTOAgreement> dtoAgreements = new ArrayList<DTOAgreement>();} 

лицо:

@Entity 
@Table(name="adt_user") 
public class User { 
private long id; 
private String account; 
private String password; 
private String statusStr; 
private UserStatus status; 
private int systemAdmin; 
private long operator; 
private String operateTime; 
private String name; 
private String company; 
private String email; 
private String telephone; 
private Set<Authority> authorities = new HashSet<Authority>(); 
private Set<Agreement> agreements = new HashSet<Agreement>();} 

я использовать сильфон метод, чтобы скопировать значение объекта, но есть исключение:

 
java.lang.IllegalArgumentException: Cannot invoke com.hna.adt.orm.User.setAuthorities - argument type mismatch 

что с этим?

BeanUtils.copyProperties(entity, value); 

ответ

0

Вы

private List<DTOAuthority> dtoAuthorities = new ArrayList<DTOAuthority>(); 

против

private Set<Authority> authorities = new HashSet<Authority>(); 

Если BeanUtils.copyProperties рассматривает только сеттеры и геттер элементов и не достаточно умен, чтобы понять, что Set и List являются коллекции и итерацию и копирует элементы один за другим, что по-прежнему требует, чтобы Authority был совместим с DTOAuthority, - тогда он выкинет эту ошибку отражения, затем Set i s не может быть присвоен от List, т. е. несовместим.

Если вы пытаетесь сделать то же самое во время компиляции

entity.setAuthorities(value.getDtoAuthorities()); 

Тогда вы получите тот же sessage как ошибки компиляции.

Вы должны либо изменить dtoAuthorities на Set, либо authorities, чтобы быть List.

+0

большое спасибо! – xuyaming

+0

@xuyaming приветствую вас! – A4L

+0

Вы также можете использовать что-то вроде [Moo] (http://github.com/geoffreywiseman/Moo) или Dozer, который может выполнять более сложный вид отображения с преобразованием. –

1

Если вы проверяете тип полномочий и соглашений, они не соответствуют определению другого класса. Чтобы beanutils работал правильно, убедитесь, что тип атрибутов соответствует.

+1

В качестве дополнительной заметки, BeanUtils делает только мелкую копию. Из javadoc: 'Обратите внимание, что этот метод предназначен для выполнения« мелкой копии »свойств и поэтому сложные свойства (например, вложенные) не будут скопированы.« – tom

+0

большое вам спасибо! я решил это – xuyaming

Смежные вопросы