Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

StringToClassConverter missing [SPR-6406] #11072

Closed
spring-projects-issues opened this issue Nov 21, 2009 · 9 comments
Closed

StringToClassConverter missing [SPR-6406] #11072

spring-projects-issues opened this issue Nov 21, 2009 · 9 comments
Assignees
Labels
in: core Issues in core modules (aop, beans, core, context, expression) type: enhancement A general enhancement
Milestone

Comments

@spring-projects-issues
Copy link
Collaborator

Martin Vanek opened SPR-6406 and commented

When new ConversionService is used,
<bean id="conversionService" class="org.springframework.core.convert.support.DefaultConversionService">
this will fail
<oxm:jaxb2-marshaller id="marshaller">
<oxm:class-to-be-bound name="com.rora.web.model.User"/>
</oxm:jaxb2-marshaller>
org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from [java.lang.String] to [java.lang.Class]

Probably due to nonexisting StringToClassConverter or such... (and no registration of it in DefaultConversionService)


Affects: 3.0 RC2

@spring-projects-issues
Copy link
Collaborator Author

Martin Vanek commented

After creating extremely dummy StringToClassConverter...
public class StringToClassConverter implements Converter<String, Class> {

public Class<?> convert(String source) {
	try {
		return Class.forName(source);
	} catch (ClassNotFoundException e) {
		// throw new IllegalArgumentException("Class not found " + source);
		return null;
	}
}

}
and registering it, context starts ok, and everything is working nicely...

<bean id="DefaultConversionService" class="org.springframework.core.convert.support.DefaultConversionService">
	<property name="converters">
		<list>
			<bean class="com.rora.web.StringToClassConverter" />
		</list>
	</property>
</bean>

<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
	<property name="parent" ref="DefaultConversionService"/>
</bean>

@spring-projects-issues
Copy link
Collaborator Author

Keith Donald commented

Hmmm, I would expect even though there is no StringToClass converter the BeanWrapper's default ClassEditor would kick in here as a fallback for compatibility reasons.

@spring-projects-issues
Copy link
Collaborator Author

Juergen Hoeller commented

Martin, what's the stacktrace of that ConverterNotFoundException? There should be a custom ClassEditor registered which is supposed to take precedence...

Are you running in a standard ApplicationContext there, with the full refresh phase having passed - i.e. not in a plain BeanFactory or the like?

Juergen

@spring-projects-issues
Copy link
Collaborator Author

Martin Vanek commented

Sorry for being late. Here is exception and it says, that Exception is thrown in WebApplicationContext. It is in context hierarchy, so it has a parent context.

2009-11-26 18:00:42,354|main |ERROR||org.mortbay.log: Nested in org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ContentNegotiatingViewResolver' defined in class path resource [spring/rora-webroot.xml]: Cannot create inner bean 'org.springframework.web.servlet.view.xml.MarshallingView#1b5459e' of type [org.springframework.web.servlet.view.xml.MarshallingView] while setting bean property 'defaultViews' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.view.xml.MarshallingView#1b5459e' defined in class path resource [spring/rora-webroot.xml]: Cannot resolve reference to bean 'marshaller' while setting bean property 'marshaller'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'marshaller': Initialization of bean failed; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value [com.rora.web.model.User] from type [java.util.ArrayList] to type [[Ljava.lang.Class;]; reason = 'No converter found capable of converting from [java.lang.String] to [java.lang.Class]'; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from [java.lang.String] to [java.lang.Class]:
org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from [java.lang.String] to [java.lang.Class]
at org.springframework.core.convert.support.CollectionToArrayConverter.convert(CollectionToArrayConverter.java:63) [spring-core-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:36) [spring-core-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:182) [spring-core-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.format.support.FormattingConversionService.convert(FormattingConversionService.java:133) [spring-context-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:179) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:135) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:442) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1351) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1310) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:289) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:286) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:188) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1305) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:270) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:120) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:355) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:153) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1305) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:289) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:286) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:188) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:558) [spring-beans-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:852) [spring-context-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:422) [spring-context-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261) [spring-web-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:192) [spring-web-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) [spring-web-3.0.0.BUILD-SNAPSHOT.jar:3.0.0.BUILD-20091118075519]

@spring-projects-issues
Copy link
Collaborator Author

Martin Vanek commented

Ugh! In latest snapshot org.springframework.core.convert.support.DefaultConversionService was deleted so now i'm stuck completely

@spring-projects-issues
Copy link
Collaborator Author

Juergen Hoeller commented

You should be able to use a ConversionServiceFactoryBean (in the same package) instead. This is basically the replacement for DefaultConversionService, aligned with FormattingConversionServiceFactoryBean now.

Juergen

@spring-projects-issues
Copy link
Collaborator Author

Keith Donald commented

This is most likely happening since the string->class converter lookup occurs under the control of the conversion service as part of the collection to array converter first matched by BeanWrapper. We would indeed need a string->class converter registered then.

@spring-projects-issues
Copy link
Collaborator Author

Martin Vanek commented

Last snapshot works for me like magic. Even with MVC validation, conversion, formatting. No custom formatter is needed anymore. Thank you guys!

	<bean id="AnnotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="webBindingInitializer">
			<bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
				<property name="validator" ref="ValidatorFactory"/>
				<property name="conversionService" ref="FormattingConversionService"/>
			</bean>
		</property>
	</bean>

	<bean id="FormattingConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />

	<bean id="ValidatorFactory" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

@spring-projects-issues
Copy link
Collaborator Author

Juergen Hoeller commented

Alright - good to hear that it works for you now!

Juergen

@spring-projects-issues spring-projects-issues added type: enhancement A general enhancement in: core Issues in core modules (aop, beans, core, context, expression) labels Jan 11, 2019
@spring-projects-issues spring-projects-issues added this to the 3.0 RC3 milestone Jan 11, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
in: core Issues in core modules (aop, beans, core, context, expression) type: enhancement A general enhancement
Projects
None yet
Development

No branches or pull requests

2 participants