开发者社区> 问答> 正文

spring3 基于注解的ehcache配置 为什么需要给每一个dao加一个接口呢??报错

spring3 基于注解的ehcache配置 为什么需要给每一个dao加一个接口呢?

在使用ehcache进行注解配置时,我发现直接给一个实现了的dao例如 SodUserDao类添加 注解在controller层会报错。

如果给SodUserDao 添加一个接口 然后再配置就不会有问题了。

ehcache 配置

<!-- ehcache -->
    <ehcache:annotation-driven cache-manager="cacheManager"/>  
   
	<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 
        <property name="configLocation" value="classpath:ehcache.xml" /> 
    </bean>

关键代码对比:

错误代码

@Repository
public class SodUserDao extends BaseDao<SodUser,Integer> {
	
	@TriggersRemove(cacheName="testCache",removeAll=true)
	public Page<SodUser> findUserByPage(int pageSize, int pageNumber){
		String sql = "select * from t_user";
		Page<SodUser> page = paginate(sql, pageNumber, pageSize,SodUser.class);
		return page;
	}
	
	@Cacheable(cacheName="testCache")
	public SodUser findOne(int id){
		String sql = "select * from t_user where id=?";
		SodUser sodUser = this.findOne(sql, new Object[]{id});
		return sodUser;
	}
	
	public SodUser findOneByHql(int id){
		String sql = "from SodUser as u where u.id=?";
		SodUser sodUser = this.findOneByHql(sql, new Object[]{id});
		return sodUser;
	}
	
	@Override
	public Class<SodUser> getEntityClass() {
		return SodUser.class;
	}
	
	
}

控制层的代码

@Controller
public class DefaultController extends BaseAction {
	
	@Autowired(required=true)
	public SodUserDao sodUserDao;
}

正确代码

先是一个接口

public interface ISodUserDao {
	public SodUser findOne(int id);
	public SodUser findOneByHql(int id);
}
实现类
@Repository
public class SodUserDaoImple implements ISodUserDao{
	
	@Cacheable(cacheName="testCache")
	public SodUser findOne(int id) {
		return null;
	}

	public SodUser findOneByHql(int id) {
		return null;
	}

}

控制层

@Controller
public class DefaultController extends BaseAction {
	
	@Autowired(required=true)
	public ISodUserDao sodUserDaoImpl;
}

怎样在不使用接口的情况下进行修改呢? 关键是写那么多接口没什么用。除非 项目非常大,对于小项目我觉得没必要。



展开
收起
爱吃鱼的程序员 2020-06-22 22:51:24 495 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    在配置中加上它试试看。。

    <!--proxy-target-class="true"强制使用cglib代理 如果为false则spring会自动选择-->

    <aop:aspectj-autoproxy proxy-target-class="true"/>
    回复 @西部流云:问题解决了就OK.你给了我灵感了我在下面代码中加入了,就好了。谢谢<ehcache:annotation-drivencache-manager="cacheManager"proxy-target-class="true"/>试试看添加 cglib.jar到依赖包cglib-2.2.jar已经添加了,都搞了3天了就是不知道怎么回事,报的错误好像是说代理的问题。
    Causedby:
    java.lang.IllegalArgumentException:Cannotsetcom.sod.dao.sys.SodUserDaofieldcom.sod.controller.DefaultController.sodUserDaoto $Proxy20
       atsun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
       atsun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
       atsun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
       atjava.lang.reflect.Field.set(Field.java:680)
       atorg.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:504)

       atorg.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)


    我觉得错误的关键字在我标注的红色部分。直接用实现类它不能正常注入。

    问题解决!!!

    需要修改配置文件,修改后如下:

    <ehcache:annotation-drivencache-manager="cacheManager" proxy-target-class="true" />

    mark

    2020-06-22 22:51:42
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多