我正在使用Spring来为专门用于使用Hibernate的DAO类的依赖关系进行接线,但是却遇到了一个让我感到困惑的异常:
$ Proxy58无法转换为UserDao
我的DAO的配置如下:
<bean id="userDao" class="com.domain.app.dao.UserDao">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
我有一个接口,抽象基类和最终实现,如下所示。
接口:
public interface Dao {
public void save(Object object);
public Object load(long id);
public void delete(Object object);
public void setSessionFactory(SessionFactory sessionFactory);
}
抽象基类:
public abstract class BaseDao implements Dao {
private SessionFactory sessionFactory;
@Transactional
@Override
public void save(Object object) {
PersistentEntity obj = (PersistentEntity) object;
currentSession().saveOrUpdate(obj);
}
@Transactional
@Override
public abstract Object load(long id);
@Transactional
@Override
public void delete(Object object) {
// TODO: this method!
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Session currentSession() {
return sessionFactory.getCurrentSession();
}
}
实现方式:
public class UserDao extends BaseDao implements Dao {
@Transactional(readOnly=true)
@Override
public Object load(long id) {
Object user = currentSession().get(User.class, id);
return user;
}
}
以下引发上述异常:
UserDao dao =(UserDao)context.getBean(“ userDao”);
但是,这不会引发异常:
刀=(刀)context.getBean(“ userDao”);
如果有人可以提供任何帮助或指导,以说明为什么会发生此异常,我将不胜感激。
Spring
默认使用JDK动态代理($Proxy58
是其中之一),它只能代理接口。这意味着动态创建的类型$Proxy58
将实现由包装的/目标类(UserDao
)实现的一个或多个接口,但它不是其实际的子类。这基本上就是为什么您可以将userDao
bean强制转换为Dao
接口 ,而不是强制转换为UserDao
类的原因 。
您可以<tx:annotation-driven proxy-target- class="true"/>
用来指示Spring使用CGLIB代理,它们是代理类的实际子类,但是我认为最好是针对接口进行编程。如果需要访问代理类中未在其接口之一中声明的某些方法,则应首先问自己,为什么会这样?
(此外,在上面的代码中,中没有引入新的方法UserDao
,因此将bean强制转换为这种具体的实现类型毫无意义。)
在Spring官方参考中了解有关不同代理机制的更多信息。
问题内容: 因此,我今天晚上将XCode更新为7.3。 在我的一个项目中,在设置字体的几个标签上出现以下错误: 编辑: 这是我的导航栏中标题视图的代码: 这是我的UILabel属性字符串的代码: 在我整个项目中,只有两个文件会发生这种情况。 我打开了另一个项目,但是即使在此我也确实为多个标签设置了字体,我也可以构建并运行它而没有任何错误。 知道为什么会这样吗? TIA! 问题答案: 在SO的其他地
我刚开始编程,我总是收到错误消息,“不兼容的类型,int不能转换为int[]”,问题是如果R1和R2的长度相等,就把它们加在一起,如果不是,打印一条消息,说“数组必须是相同的长度”,如果这很重要,不确定我在哪里出错了,任何帮助都将非常感谢
我在HackerRank(对角线差异)上做这个问题,我现在面临一个问题。 以下是问题的链接: https://www.hackerrank.com/challenges/diagonal-difference/problem 问题是,我总是得到一个错误:。 我尝试初始化变量j,但这也不能解决问题。 下面是我的代码:
MainActivity.java 对不起,我的英语很差。