2016-03-15 40 views
2

我遇到了与链接中提到的相同的问题: Mongo spring-data issue with java.util.Currency 我试过接受的答案。但其没有工作,我在行获得NullPointerException异常:java.util.currency发布spring-data-mongodb问题

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

所以我定义的新类转换器,像这样:

@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(); 
    } 
    } 

@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); 
    } 
} 

我用他们在“customConversions()”中显示如下:

@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); 
    } 
} 

当春天启动应用程序启动时,我可以看到下面印statments:

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

但是,当我试图从MongoDB中我的对象,它从来没有所谓的“转换”,在转换班组长方法,而且,我始终得到此异常:

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) 

我跟着这个链接也:

Spring not using mongo custom converters

按照链接中的建议,我将@Configuration注释更改为类中的@Component,CustomMongoConfiguration。但它也不起作用。如果我使用@Component注释,下面的语句会多次打印。我不知道原因。

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

我使用的是spring-boot版本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> 

顺便说一句,我使用的application.properties配置MongoDB的特性,但没有任何基于Java的配置:

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 

我竭力要解决这个过去三天。任何人都可以请帮助我。

回答

1

我的坏。问题在于先前在mongodb中插入的数据。早些时候以不正确的“货币”格式即mongodb插入。,而不是像美元只是字符串值,GBP它具有如下结构:

"currency" : { 
         "currencyCode" : "GBP", 
         "defaultFractionDigits" : 2, 
         "numericCode" : 826 
       } 

,而不是简单的代码,如:

"currency" : "GBP" 

后,我写了转换器,蒙戈无法分析这种结构和抛出该异常:

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) 

我觉得这个例外是有误导性的。无论如何,我想通了。现在两个转换器都被调用了。

最终解决方案,为我工作:

@Configuration 
public class CustomMongoConfiguration extends AbstractMongoConfiguration { 
    @Autowired 
    private MongoProperties mongoProps; 

    @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); 
    } 

    @Override 
    protected String getDatabaseName() { 
     return mongoProps.getDatabase(); 
    } 

    @Override 
    @Bean 
    public Mongo mongo() throws Exception { 
     return new MongoClient(mongoProps.getHost(), mongoProps.getPort()); 
    } 
} 

按照春天文档,http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.converter-disambiguation,你需要把上只有两个来源&目标是原生类型(前转换器@ReadingConverter@WritingConverter:串地龙或长到字符串)。否则,你不需要把它们放在转换器上。在我的情况下,那些不需要货币是不是本机蒙戈类型。

2

Currency转换已通过b7131b添加,并且从1.9.0.M1开始提供。

请加@ReadingConverter@WritingConverterConverter实现,这样CustomConversions不仅底层ConversionService知道这些的。

+0

没有。它不工作。获取相同的错误org.springframework.data.mapping.model.MappingException:在实体类java.util.Currency上找不到属性null,以将构造函数参数绑定到! at org.springframework.data.mapping.model.PersistentEntityParameterValueProvider.getParameterValue(PersistentEntityParameterValueProvider.java:74) ' – kaluva

+0

我有疑问。我是否需要在代码中的任何位置调用Converter的“convert”方法。我在想,这些会自动调用。如我错了请纠正我? – kaluva