配置了强制使用cglib,但spring还是使用JDK代理service,所有的service都实现了IGenericService接口,而且在有注入bean的地方,会报错:
Cannot convert value of type [$Proxy10 implementing org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,net.sf.cglib.proxy.Factory,com.xxx.service.IGenericService] to required type [com.xxx.service.impl.UserService] for property 'userService': no matching editors or conversion strategy found
aop的配置:使用的是cglib-nodep-2.1_3.jar
<aop:aspectj-autoproxy proxy-target-class="true"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="*" rollback-for="Exception" />
</tx:attributes>
</tx:advice>
<aop:config proxy-target-class="true" >
<aop:pointcut id="serviceMethod"
expression="execution(* com.xxx.service.impl..*Service.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" />
</aop:config>
折腾一天了,不知道问题出在哪里,求指点
问题补充:spring使用版本是3.1.4
问题补充:继承关系:
public class UserService extends GenericServiceImpl<User, Long> {...
父类:
public class GenericServiceImpl<T, ID extends Serializable> implements IGenericService<T,ID>{...
public GenericServiceImpl() {...
问题补充:application.xml里:
<context:component-scan base-package="org.mtm.framework.ssi">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
dispatch-servlet.xml:
<aop:aspectj-autoproxy proxy-target-class="true"/>
<context:component-scan base-package="org.mtm.framework.ssi" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<mvc:annotation-driven/>
项目里一个地方用到了userService:
@Resource
public void setUserService(UserService userService) {
this.userService = userService;
}
问题补充:上面的base-package="org.mtm.framework.ssi"应该是com.xxx,就是和事务包对应的
问题补充:异常信息:
Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type '$Proxy10 implementing org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,net.sf.cglib.proxy.Factory,xxxxx.service.IGenericService' to required type 'xxxx.service.impl.UserService' for property 'userService'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [$Proxy10 implementing org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,net.sf.cglib.proxy.Factory,xxxxx.service.IGenericService] to required type [xxxxx.service.impl.UserService] for property 'userService': no matching editors or conversion strategy found
at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:485)
at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:516)
at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:510)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1406)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1365)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
... 88 more
Caused by: java.lang.IllegalStateException: Cannot convert value of type [$Proxy10 implementing org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,net.sf.cglib.proxy.Factory,xxxxx.service.IGenericService] to required type [xxxx.service.impl.UserService] for property 'userService': no matching editors or conversion strategy found
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:247)
at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:470)
... 94 more
相关推荐
然而,如果需要更精细的控制,可以通过`@EnableAspectJAutoProxy`注解开启基于AspectJ的自动代理支持,或者通过`proxyTargetClass`属性来强制使用CGLIB代理。 总结一下,Spring的AOP机制通过JDK动态代理和CGLIB动态...
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用CGLIB实现AOP? * 添加CGLIB库,SPRING_HOME/cglib/*.jar * 在spring配置文件中加入<aop:aspectj-...
CGLIB代理提供了更广泛的应用场景,但相比JDK动态代理,它的性能稍差。 3. **代理选择**:Spring默认优先使用JDK动态代理,如果无法满足条件(即目标类没有实现接口),则会自动切换到CGLIB。可以通过配置`proxy...
3. **调整代理模式**:对于CGLIB代理,可以在配置中设置`proxyTargetClass=true`,强制Spring使用CGLIB,即使目标类实现了接口。由于CGLIB创建的是目标类的子类,所以不会导致循环依赖。但是,这可能会引入额外的...
在Java中,Spring提供了基于接口的JDK动态代理和基于类的CGLIB代理。JDK动态代理适用于实现了接口的目标对象,它会生成一个代理类,这个代理类同时实现了目标对象的所有接口,并在调用接口方法时插入通知。CGLIB代理...
Spring会自动选择合适的代理方式,但也可以通过配置强制使用CGLIB代理。 此外,本文还通过代码示例展示了如何在Spring项目中使用注解进行配置: - 使用@ComponentScan注解指定扫描的包路径,用于自动发现和注册...
如果目标对象没有实现接口,则Spring默认使用CGLIB代理。在强制使用CGLIB实现AOP时,需要在Spring配置文件中进行配置或通过编程方式引入CGLIB库。 SpringMVC是Spring提供的一个用于Web应用的模型-视图-控制器(MVC...
可以通过配置的proxy-target-class属性来强制使用CGLIB代理。 在Spring源码分析中,理解AOP的设计原理对于理解整个框架的运作非常有帮助。通过AOP,我们可以在不修改源代码的情况下,通过预编译或运行时动态代理的...
Spring提供两种代理模式:JDK动态代理和CGLIB代理。JDK代理适用于实现了接口的目标类,而CGLIB代理则针对未实现接口的类。默认情况下,Spring会尝试使用JDK代理,如果目标类没有接口,就会自动切换到CGLIB。也可以...
Spring面试题详细讲解 Spring 是什么? Spring 是一个轻量级的 ...1. Spring 事务的只读“只读事务”并不是一‘’个强制选项,它只是一个“暗示”,提示数据库驱动程序和数据库系统,这个事务并不包含更改数据的操作
4. **代理(Proxy)**:Spring提供了两种类型的代理——JDK动态代理和CGLIB代理。前者适用于接口实现类,后者用于没有接口或需要代理的目标类。Spring会自动选择合适的代理方式,但也可以通过配置强制使用某一种。 ...
Spring框架中应用了多种设计模式,如工厂模式(BeanFactory)、单例模式(默认Bean作用域)、装饰器模式(AOP代理)、代理模式(JDK动态代理和CGLIB)、观察者模式(事件发布)等。 以上就是Spring框架的一些核心...
4. **轻量级**:Spring不强制使用特定的持久化策略或视图技术,可以与其他框架很好地集成,保持轻量级特性。 5. **可测试性**:Spring通过DI和接口编程提高了代码的可测试性,使得单元测试变得简单,增强了软件的...
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了
- **强制使用 CGLib 代理**:通过设置 `proxyTargetClass` 属性为 `true` 可以强制使用 CGLib 代理。 - **接口指定**:如果目标类实现了多个接口,则可以通过设置 `proxyInterfaces` 属性来指定创建的代理类型。 ##...
在XML配置中,可以通过`proxy-target-class="true"`属性来强制使用CGLIB代理。 在提供的压缩包文件中,`.classpath`和`.project`是Eclipse项目的配置文件,`.settings`可能包含了项目的特定设置,而`src`目录则包含...
Spring 基于 ProxyFactoryBean 创建 AOP 代理 ProxyFactoryBean 是 Spring 中用于创建 AOP 代理的重要工具类,它提供了完整的控制能力,可以生成指定的内容。下面将详细介绍 ProxyFactoryBean 的使用方法和 Spring...
- 轻量级:Spring不强制使用特定的持久层或视图技术,可以与多种框架集成,如Struts、Hibernate等。 - 无侵入性:Spring的应用对象可以独立于Spring框架存在,只有在需要时才引入Spring的管理。 - 面向接口编程:...