2016-03-15 72 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