`
logicigam
  • 浏览: 32920 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

调用getter方法报 IllegalArgumentException的问题

阅读更多
尝试做一个SSH+spring security+blazeDS+flex的例子,修改用户信息的时候报了这么个怪异常
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
......


我操作的用户类定义如下

@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替代了,这还真是个问题,延迟加载已经够让我头大的了,这个怎么说也得搞定!
分享到:
评论

相关推荐

    Java反射通过Getter方法获取对象VO的属性值过程解析

    接下来,我们遍历所有字段,并使用`invokeMethod()`方法来调用Getter方法获取属性值。最后,我们将属性名、属性值和属性值类型存储在Map中。 使用 FieldsCollector 类,我们可以轻松地获取对象的属性值,并将其存储...

    JAVA-提高反射效率

    反射是Java中一项强大的功能,它允许程序在运行时检查类、接口、字段和方法的信息,并且可以动态地调用方法或修改字段值。这种能力使得Java程序具有高度的灵活性和可扩展性。 #### 二、反射效率问题 虽然反射提供...

    java反射实现javabean转json实例代码.docx

    通常会包含创建JavaBean实例的方法及调用`ObjectToJson`类的方法进行转换的逻辑。 #### 五、示例代码详解 以下是对示例代码中关键部分的详细解释: ```java public static String ObjToJson(Object obj) { ...

    JAVABEAN方法实例

    这可以通过调用Java的内置`indexOf()`方法来完成,该方法返回子字符串在父字符串中首次出现的索引。如果未找到,则返回-1。例如: ```java public int findPosition() { if (string2 != null && !string2.isEmpty...

    MLDN魔乐JAVA_04封装性.rar

    通常,类的公共方法是对外提供的接口,供其他类调用。 2. **private**:私有访问修饰符,是最严格的访问级别,只允许在同一个类内部访问。这是实现封装的关键,常用来保护类的内部数据,防止外部代码直接修改。 3....

    JAVA实现计算立体图形体积、面积,通过接口类实现

    8. **封装**:为了遵循面向对象的原则,图形类的属性应设为私有(`private`),并提供公共的getter和setter方法来访问和修改这些属性。这样可以保护数据不被外部直接操作,提高代码的安全性。 通过以上步骤,我们...

    java1-6章测试题目.docx

    JavaBean是一种遵循一定规范的Java类,用于数据封装,具有getter和setter方法。标准JavaBean遵循JavaBeans规范,具有属性、构造器和事件处理。 `= =`用于比较对象的引用,`equals()`比较对象内容。成员变量在类加载...

    软件开发中异常分析

    例如,在Hibernate框架中,如果尝试通过getter方法获取一个并不存在的属性值,则会抛出此类异常。具体到案例中,当调用`getGAccountId()`时,如果对应的JavaBean模型中没有定义相应的`GAccountId`属性,则会引发异常...

    常见java异常.txt

    - 解决方法:确保访问权限与被访问成员的访问级别相匹配,或通过提供公共的getter和setter方法来间接访问。 7. **IncompatibleClassChangeError(不兼容的类变更错误)** - 类层次结构:java.lang.Object -&gt; java...

    Java面向对象思想总结

    // 其他getter和setter方法 } ``` **2. 继承** - **概念**:继承是一种“is-a”的关系,表示一个类是另一个类的扩展或变体。Java使用`extends`关键字来声明一个类继承自另一个类。 - **特性**: - 单继承:...

    java中常用的异常类型.docx

    - 如果需要跨类访问,可以考虑使用 getter/setter 方法或调整类的设计以满足访问需求。 ### 其他常见异常类型 除了上述几种异常外,Java 中还有许多其他类型的异常值得了解: - **类型强制转换异常 (`...

    13-JavaBeans-Chinese.pdf

    - **不应有公开的实例变量**:JavaBeans 不应该有公开的实例变量,所有的属性都应该通过 getter 和 setter 方法进行访问和修改。 - **属性访问**:JavaBeans 的属性可以通过 `getXxx` 和 `setXxx` 方法来访问,其中 ...

    java反射实现javabean转json实例代码

    此外,所有的属性都是私有的,并且它们通过公共的方法进行访问(即属性的setter和getter方法)。Java Bean常用于Java应用中的数据传输对象(DTO)。 3. JSON概念及格式 JSON(JavaScript Object Notation)是一种轻...

    JavaBean 属性

    当 `ourString` 的值发生变化时,通过调用 `changes.firePropertyChange()` 方法触发事件通知监听器。 #### 4. Constrained 属性 Constrained 属性是指受到限制的属性,通常需要满足一定的约束条件才能被设置。这...

    spring数据格式转换

    在设置或获取这些属性的值时,Spring会自动调用相应的setter和getter方法。 为了进行自定义的数据绑定,我们可以创建自己的`PropertyEditor`实现。例如,如果我们有一个名为`PhoneNumberModel`的类,其属性`phone...

    JavaBean创建和使用:计算器

    接下来,我们可以调用JavaBean的方法并显示结果: ```jsp int result = calculator.add(); out.println("结果:" + result); %&gt; ``` 在本例中,`Jspwork501`可能是一个包含相关示例代码或资源的文件夹,可能...

    最全的java面试题,附答案的

    - **保护内部状态**:通过私有化类的属性,确保它们只能通过公共方法(通常是getter和setter方法)访问和修改,从而保护对象内部的状态不受外部非法操作的影响。 - **增强模块化**:封装使得对象之间的交互仅限于...

    简单实体类和xml文件的相互转换方法

    如`NoSuchMethodException`, `IllegalAccessException`, `IllegalArgumentException`, `InvocationTargetException`等,这是因为在反射调用方法时可能会抛出这些异常,通过捕获这些异常,可以确保程序在遇到问题时能...

    JAVA资格认证:SCJP310-055中文

    - **JavaBean命名规范**: JavaBean的属性通常遵循驼峰命名法,如`firstName`,并且为每个属性提供getter和setter方法,如`getFirstName()`和`setFirstName(String value)`。 - **可变参数**: Java允许方法接收不定...

    矩阵乘法.rar矩阵数学

    总之,矩阵乘法是计算机科学中不可或缺的一部分,掌握其概念和实现方法对于理解和解决复杂问题至关重要。通过Java实现矩阵乘法,不仅能够加深对线性代数的理解,也能提升编程技能,为后续的高级应用打下坚实基础。

Global site tag (gtag.js) - Google Analytics