Cannot convert value of type String to MethodSecurityMetadataSource (Spring 3.1)

java, spring, spring-security

Solution

The class that was in charge of converting the string that appears at your `securityMetadataSource` `value` to a MethodSecurityMetadataSource instance - MethodSecurityMetadataSourceEditor was removed in Spring 3.1, this is why you are getting the exception.

A new class was added though in 3.1: MethodSecurityMetadataSourceBeanDefinitionParser. It provides you with a new tag in your XML file. So, instead of :

  <value>
     com.myPackage.foo=ROLE_ADMIN
     com.myPackage.bar=ROLE_ADMIN
     com.myPackage.inner.*=ROLE_ADMIN
  </value>

You can now write:

 <s:method-security-metadata-source> 
    <s:protect method="com.myPackage.foo" access="ROLE_ADMIN"/>
    <s:protect method="com.myPackage.bar" access="ROLE_ADMIN"/>
    <s:protect method="com.myPackage.inner.*" access="ROLE_ADMIN"/>
 </s:method-security-metadata-source>

P.S.: Don't forget to update the xml schema to 3.1:

xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

Problem

After an upgrade from Spring 3.0.0 to 3.1.0 I am unable to instantiate the MethodSecurityInterceptor bean. Here is the original bean definition, that worked in Spring 3.0.0: ``` <bean id="methodSecurityInterceptor" class="org.springframework.security.access.interce pt.aopalliance.MethodSecurityInterceptor"> <property name="authenticationManager" ref="myAuthenticationManager" /> <property name="accessDecisionManager" ref="myAccessDecisionManager" /> <property name="securityMetadataSource"> <value> com.myPackage.foo=ROLE_ADMIN com.myPackage.bar=ROLE_ADMIN com.myPackage.inner.*=ROLE_ADMIN </value> </bean> ``` This exception is thrown: ``` exception is org.springframework.beans.ConversionNotSupportedEx ception: Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.security.access.method.Method SecurityMetadataSource' for property 'securityMetadataSource'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.springframework.security.access.method.MethodS ecurityMetadataSource] for property 'securityMetadataSource': no matching editors or conversion strategy found at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.doCreateBean(AbstractAu towireCapableBeanFactory.java:527) at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.createBean(AbstractAuto wireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.Abstract BeanFactory$1.getObject(AbstractBeanFactory.java:2 93) at org.springframework.beans.factory.support.DefaultS ingletonBeanRegistry.getSingleton(DefaultSingleton BeanRegistry.java:222) at org.springframework.beans.factory.support.Abstract BeanFactory.doGetBean(AbstractBeanFactory.java:290 ) at org.springframework.beans.factory.support.Abstract BeanFactory.getBean(AbstractBeanFactory.java:196) at org.springframework.aop.support.AbstractBeanFactor yPointcutAdvisor.getAdvice(AbstractBeanFactoryPoin tcutAdvisor.java:80) at org.springframework.aop.aspectj.AspectJProxyUtils. isAspectJAdvice(AspectJProxyUtils.java:67) at org.springframework.aop.aspectj.AspectJProxyUtils. makeAdvisorChainAspectJCapableIfNecessary(AspectJP roxyUtils.java:49) at org.springframework.aop.aspectj.autoproxy.AspectJA wareAdvisorAutoProxyCreator.extendAdvisors(AspectJ AwareAdvisorAutoProxyCreator.java:101) at org.springframework.aop.framework.autoproxy.Abstra ctAdvisorAutoProxyCreator.findEligibleAdvisors(Abs tractAdvisorAutoProxyCreator.java:88) at org.springframework.aop.framework.autoproxy.Abstra ctAdvisorAutoProxyCreator.getAdvicesAndAdvisorsFor Bean(AbstractAdvisorAutoProxyCreator.java:68) at org.springframework.aop.framework.autoproxy.Abstra ctAutoProxyCreator.wrapIfNecessary(AbstractAutoPro xyCreator.java:359) at org.springframework.aop.framework.autoproxy.Abstra ctAutoProxyCreator.postProcessAfterInitialization( AbstractAutoProxyCreator.java:322) at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.applyBeanPostProcessors AfterInitialization(AbstractAutowireCapableBeanFac tory.java:407) at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.initializeBean(Abstract AutowireCapableBeanFactory.java:1426) at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.doCreateBean(AbstractAu towireCapableBeanFactory.java:519) ... 24 more Caused by: org.springframework.beans.ConversionNotSupportedEx ception: Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.security.access.method.Method SecurityMetadataSource' for property 'securityMetadataSource'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.springframework.security.access.method.MethodS ecurityMetadataSource] for property 'securityMetadataSource': no matching editors or conversion strategy found at org.springframework.beans.BeanWrapperImpl.convertI fNecessary(BeanWrapperImpl.java:481) at org.springframework.beans.BeanWrapperImpl.convertF orProperty(BeanWrapperImpl.java:518) at org.springframework.beans.BeanWrapperImpl.convertF orProperty(BeanWrapperImpl.java:512) at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.convertForProperty(Abst ractAutowireCapableBeanFactory.java:1371) at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.applyPropertyValues(Abs tractAutowireCapableBeanFactory.java:1330) at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.populateBean(AbstractAu towireCapableBeanFactory.java:1086) at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.doCreateBean(AbstractAu towireCapableBeanFactory.java:517) ... 40 more Caused by: java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.springframework.security.access.method.MethodS ecurityMetadataSource] for property 'securityMetadataSource': no matching editors or conversion strategy found at org.springframework.beans.TypeConverterDelegate.co nvertIfNecessary(TypeConverterDelegate.java:233) at org.springframework.beans.BeanWrapperImpl.convertI fNecessary(BeanWrapperImpl.java:466) ... 46 more ``` Any help will be appreciated.

Original source