I'm trying to setup the Spring Data/JPA DomainClassConverter to automatically convert (String) id's to the domain classes itself.
My project is uses Java Config (so no xml).
In my WebConfig I have currently:
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new DomainClassConverter<DefaultFormattingConversionService>((DefaultFormattingConversionService) registry));
}
}
This seems to hook up the DomainClassConverter successfully as I can see it inside the conversion service when printing that:
ConversionService converters =
..<default converters>..
org.springframework.data.repository.support.DomainClassConverter@6ea4ce0d, org.springframework.core.convert.support.IdToEntityConverter@5d3f03b, org.springframework.core.convert.support.ObjectToObjectConverter@1d40b47a
But when submitting a nested form (Order with Customer ref) the Customer is not converted automatically and hence I get a:
Failed to convert property value of type java.lang.String to required type org.mycomp.domain.Customer for property customer; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.mycomp.domain.Customer] for property customer: no matching editors or conversion strategy found
I'm wondering if I'm doing something wrong here?
The exception is telling you that you need a custom converter to turn a String into a Customer. You'll have to tokenize the input and map it into Customer fields. That's true for all your domain classes.
A Google search also lead me to a thread in the Spring forum:
http://forum.springsource.org/showthread.php?122944-Help-with-DomainClassConverter-configuration
It suggests that there might be a bug, depending on which version of Spring you're using.
DomainClassConverter
should be declared as a bean (because it'sApplicationContextAware
), and it registers itself inConversionService
automatically, so that you don't need to register it manually: