2013-09-28 301 views
0

DTO对象:参数类型不匹配

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只考虑制定者和元素的getter和不够聪明弄清楚,SetList都集合和迭代并复制元素一个接一个 - 这仍然要求Authority兼容DTOAuthority - 然后它会抛出这个反射错误,然后Set我不可从List转让,即不兼容。

如果你试图做同样在编译时

entity.setAuthorities(value.getDtoAuthorities()); 

然后你会得到相同的sessage的编译错误。

您应该将dtoAuthorities更改为SetauthoritiesList

+0

非常感谢你! – xuyaming

+0

@xuyaming欢迎您! – A4L

+0

你也可以使用[Moo](http://github.com/geoffreywiseman/Moo)或Dozer之类的东西,它可以通过转换完成更复杂的映射。 –

1

如果您检查权限和协议的类型,它们与其他类定义不匹配。为了beanutils正常工作,请确保属性的类型匹配。

+1

作为一个额外的注意事项,BeanUtils只做一个浅拷贝。从javadoc:'请注意,此方法旨在执行属性的“浅拷贝”,因此复杂的属性(例如,嵌套的属性)将不会被复制。“ – tom

+0

非常感谢!我已经解决了它 – xuyaming