org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of org.catablog.entity.IdEntity.entityId

尝试做一个SSH+spring security+blazeDS+flex的例子,修改用户信息的时候报了这么个怪异常

Java代码 复制代码
  1. org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of org.catablog.entity.IdEntity.entityId   
  2. at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:195) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]   
  3.     at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:206) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]   
  4. .....   
  5. Caused by: java.lang.IllegalArgumentException: java.lang.ClassCastException@156f770  
  6. ......  
org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of org.catablog.entity.IdEntity.entityId
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:195) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:206) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
.....
Caused by: java.lang.IllegalArgumentException: java.lang.ClassCastException@156f770
......


我操作的用户类定义如下

Java代码 复制代码
  1.   
  2. @Entity  
  3. //表名与类名不相同时重新定义表名.   
  4. @Table(name = "USERS")   
  5. //默认的缓存策略.   
  6. @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)   
  7. public class User extends IdEntity {   
  8.   
  9.     private String loginName;   
  10.     private String password; //为简化演示,使用明文保存密码.   
  11.     private String name;   
  12.     private String email;   
  13.   
  14.     private Set<Role> roles = new LinkedHashSet<Role>(); //有序的关联对象集合.   
  15.   
  16.     public String getLoginName() {   
  17.         return loginName;   
  18.     }   
  19.   
  20.     public void setLoginName(String loginName) {   
  21.         this.loginName = loginName;   
  22.     }   
  23.   
  24.     public String getPassword() {   
  25.         return password;   
  26.     }   
  27.   
  28.     public void setPassword(String password) {   
  29.         this.password = password;   
  30.     }   
  31.   
  32.     public String getName() {   
  33.         return name;   
  34.     }   
  35.   
  36.     public void setName(String name) {   
  37.         this.name = name;   
  38.     }   
  39.   
  40.     public String getEmail() {   
  41.         return email;   
  42.     }   
  43.   
  44.     public void setEmail(String email) {   
  45.         this.email = email;   
  46.     }   
  47.     @Fetch(FetchMode.SUBSELECT)   
  48.     @LazyCollection(LazyCollectionOption.FALSE)   
  49.     @ManyToMany  
  50.     //多对多定义.   
  51.     @JoinTable(name = "USERS_ROLES", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })   
  52.     //集合按id排序.   
  53.     @OrderBy("entityId")   
  54.     //集合中对象的id的缓存.   
  55.     @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)   
  56.     public Set<Role> getRoles() {   
  57.         return roles;   
  58.     }   
  59.   
  60.     public void setRoles(Set<Role> roles) {   
  61.         this.roles = roles;   
  62.     }   
  63.   
  64.     //非持久化属性.   
  65.     @Transient  
  66.     public String getRoleNames() throws Exception {   
  67.         return ReflectionUtils.fetchElementPropertyToString(roles, "name"", ");   
  68.     }   
  69.   
  70.     //非持久化属性.   
  71.     @Transient  
  72.     @SuppressWarnings("unchecked")   
  73.     public List<Long> getRoleIds() throws Exception {   
  74.         return ReflectionUtils.fetchElementPropertyToList(roles, "id");   
  75.     }   
  76.   
  77. }  
@Entity
//表名与类名不相同时重新定义表名.
@Table(name = "USERS")
//默认的缓存策略.
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User extends IdEntity {

	private String loginName;
	private String password; //为简化演示,使用明文保存密码.
	private String name;
	private String email;

	private Set<Role> roles = new LinkedHashSet<Role>(); //有序的关联对象集合.

	public String getLoginName() {
		return loginName;
	}

	public void setLoginName(String loginName) {
		this.loginName = loginName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}
	@Fetch(FetchMode.SUBSELECT)
	@LazyCollection(LazyCollectionOption.FALSE)
	@ManyToMany
	//多对多定义.
	@JoinTable(name = "USERS_ROLES", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
	//集合按id排序.
	@OrderBy("entityId")
	//集合中对象的id的缓存.
	@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
	public Set<Role> getRoles() {
		return roles;
	}

	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}

	//非持久化属性.
	@Transient
	public String getRoleNames() throws Exception {
		return ReflectionUtils.fetchElementPropertyToString(roles, "name", ", ");
	}

	//非持久化属性.
	@Transient
	@SuppressWarnings("unchecked")
	public List<Long> getRoleIds() throws Exception {
		return ReflectionUtils.fetchElementPropertyToList(roles, "id");
	}

}


entityId是我所有VO的公共父类,把ID的定义抽象出来了,从上面的异常消息可以看出是参数类型转换的时候报了类型转换非法异常,抛异常的是Hibernate的BasicPropertyAccessor,这可是Hibernate的基本组件,我在修改用户信息之前就已经查询过一次了,如果是我的entityId的类型有问题,那查询的时候就会调用BasicPropertyAccessor的get方法,那个时候就该报错了,也不该撑到这会儿。Debug了一下才发现User实例里的Roles集合里面全是ASObject?!怪不得,ASObject当然没有getter setter了。
刚开始纳闷儿怎么我的actionScript User类传到java这边就能转成对应的User类,User里的Role集合一过来就变成了ASObject?后来才明白,ActionScript不支持泛型的,Role类放进User里的Roles ArrayCollection的时候类型就没了,传到java那边儿当然识别不出Role的类型,就只能用ASObject替代了,这还真是个问题,延迟加载已经够让我头大的了,这个怎么说也得搞定!

org.mvel2.PropertyAccessException: [Error: null pointer: xsetz.indexOf('.')] [Near : {... xsetz.indexOf('.') > 0 ....}] ^ [Line: 1, Column: 1] at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:450) at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:163) at org.mvel2.optimizers.dynamic.DynamicOptimizer.optimizeAccessor(DynamicOptimizer.java:80) at org.mvel2.ast.ASTNode.optimize(ASTNode.java:159) at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:115) at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:125) at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85) at org.mvel2.compiler.CompiledExpression.getDirectValue(CompiledExpression.java:123) at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:119) at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:113) at org.mvel2.MVEL.executeExpression(MVEL.java:929) at com.creating.services.mdruleexecute.MdruleMain.lambda$runMdResult$0(MdruleMain.java:85) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.NullPointerException: null at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:383) ... 14 common frames omitted
最新发布
06-09
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值