spring-data-mongodb issue with java.util.currency

Viewed 1131

I'm facing the same issue as mentioned in the link: Mongo spring-data issue with java.util.Currency I tried the accepted answer. But its not working and i'm getting NullPointerException at line:

new CustomConversions(Arrays.asList(currencyToString, stringToCurrency));

So i defined converters in new classes, like this:

@Component
public class CurrencyToStringConverter implements Converter<Currency,String>{

    /* (non-Javadoc)
     * @see com.fasterxml.jackson.databind.util.Converter#convert(java.lang.Object)
     */
    @Override
    public String convert(Currency arg0) {
        System.out.println("***INSIDE CurrencyToStringConverter***"+arg0);
        return arg0.getCurrencyCode();
    }
  }

and

@Component
public class StringToCurrencyConverter implements Converter<String,Currency>{
/* (non-Javadoc)
 * @see org.springframework.core.convert.converter.Converter#convert(java.lang.Object)
 */
    @Override
    public Currency convert(String arg0) {
        System.out.println("***INSIDE StringToCurrencyConverter***"+arg0);
        return Currency.getInstance(arg0);
    }
}

I used them in "customConversions()" as shown below:

@Configuration
public class CustomMongoConfiguration extends AbstractMongoConfiguration {
    @Autowired
    private Environment env;

    @Bean
  @Override
  public CustomConversions customConversions() {
      System.out.println("***CUSTOM MONGO CONVERSIONS***");
    List<Converter<?,?>> converters=new ArrayList<>();
    converters.add(new CurrencyToStringConverter());
    converters.add(new StringToCurrencyConverter());

    return new CustomConversions(converters);
  }

    /* (non-Javadoc)
     * @see org.springframework.data.mongodb.config.AbstractMongoConfiguration#getDatabaseName()
     */
    @Override
    protected String getDatabaseName() {
        // TODO Auto-generated method stub
        String prop = env.getProperty("spring.data.mongodb.database");
        System.out.println("database naem:: "+prop);
        return prop;
    }

    /* (non-Javadoc)
     * @see org.springframework.data.mongodb.config.AbstractMongoConfiguration#mongo()
     */
    @Override
    @Bean
    public Mongo mongo() throws Exception {
        String prop = env.getProperty("spring.data.mongodb.host");
        System.out.println("host naem:: "+prop);
        return new MongoClient(prop);
    }
}

When spring-boot application starts up, i could see below statments printed:

System.out.println("***CUSTOM MONGO CONVERSIONS***");
System.out.println("database naem:: "+prop);
System.out.println("host naem:: "+prop);

But when i try to get my object from MongoDB, it never calls "convert" methods in Converter classs and moreover, i always get this exception:

org.springframework.data.mapping.model.MappingException: No property null found on entity class java.util.Currency to bind constructor parameter to!
    at org.springframework.data.mapping.model.PersistentEntityParameterValueProvider.getParameterValue(PersistentEntityParameterValueProvider.java:74)
    at org.springframework.data.mapping.model.SpELExpressionParameterValueProvider.getParameterValue(SpELExpressionParameterValueProvider.java:63)
    at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:71)
    at org.springframework.data.convert.ClassGeneratingEntityInstantiator.createInstance(ClassGeneratingEntityInstantiator.java:83)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:251)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:231)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readValue(MappingMongoConverter.java:1186)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.access$200(MappingMongoConverter.java:78)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:1134)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.getValueInternal(MappingMongoConverter.java:870)

I followed this link too:

Spring not using mongo custom converters

I changed @Configuration annotation to @Component in the class,CustomMongoConfiguration,as suggested in the link. But Its also not working. If i use @Component annotation, below statements are getting printed multiple times. I dont know the reason.

System.out.println("***CUSTOM MONGO CONVERSIONS***");
System.out.println("database naem:: "+prop);
System.out.println("host naem:: "+prop);

I'm using spring-boot version 1.3.2.RELEASE.

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.2.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
</parent>

By the way, i'm using application.properties to configure mongodb properties but not any java based configuration:

spring.data.mongodb.host=localhost
spring.data.mongodb.password=
spring.data.mongodb.port=27017
spring.data.mongodb.repositories.enabled=true
spring.data.mongodb.database=abcde

I'm struggling to solve this for the past three days. Can anyone please help me out.

2 Answers
Related