2016-04-29 2 views
0

スプリングブートのConfigurationPropertiesマップを作成するときにnullポインタ例外が発生します。スプリングブートを作成するときのヌルポインタConfigurationProperties Map <String、Object>

things.layouts: 
3042: 
    itemPageIndex: 1 
    itemX: 1960 
    itemY: 890 
    itemWidth: 400 
    itemHeight: 70 
    itemPattern: dd MMMM yyyy 
2151: 
    itemPageIndex: 0 
    itemX: 2000 
    itemY: 796 
    itemWidth: 500 
    itemHeight: 70 
    itemPattern: dd/MM/yyyy 

を意図はプロパティがバインドされるということである、と私は次のようになります。プロパティクラスは、プロパティで指定された正しいプロパティファイルでThingLayoutは、簡単なPOJOです

@Component 
@ConfigurationProperties(prefix = "thing") 
public class ThingProperties { 

private Map<String, ThingLayout> layouts; 

public Map<String, ThingLayout> getLayouts() { 
    return layouts == null ? new HashMap<>() : layouts; 
} 

public void setLayouts(final Map<String, ThingLayout> layouts) { 
    this.layouts = new HashMap(layouts); 
} 
} 

です私が手に例外が

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'thingProperties': Could not bind properties to ThingProperties (prefix=things, ignoreInvalidFields=false, ignoreUnknownFields=true, ignoreNestedProperties=false); nested exception is java.lang.IllegalArgumentException: Target object must not be null 
at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:339) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE] 
at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:289) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
... 47 common frames omitted 
Caused by: java.lang.IllegalArgumentException: Target object must not be null 
at org.springframework.util.Assert.notNull(Assert.java:115) ~[spring-core-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.AbstractNestablePropertyAccessor.setWrappedInstance(AbstractNestablePropertyAccessor.java:205) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.BeanWrapperImpl.setWrappedInstance(BeanWrapperImpl.java:138) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.AbstractNestablePropertyAccessor.<init>(AbstractNestablePropertyAccessor.java:165) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.BeanWrapperImpl.<init>(BeanWrapperImpl.java:131) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.BeanWrapperImpl.newNestedPropertyAccessor(BeanWrapperImpl.java:223) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.BeanWrapperImpl.newNestedPropertyAccessor(BeanWrapperImpl.java:63) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.AbstractNestablePropertyAccessor.getNestedPropertyAccessor(AbstractNestablePropertyAccessor.java:853) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyAccessorForPropertyPath(AbstractNestablePropertyAccessor.java:813) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyHandler(AbstractNestablePropertyAccessor.java:724) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyType(AbstractNestablePropertyAccessor.java:485) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.boot.bind.RelaxedDataBinder.resolvePropertyName(RelaxedDataBinder.java:421) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE] 
at org.springframework.boot.bind.RelaxedDataBinder.getActualPropertyName(RelaxedDataBinder.java:385) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE] 
at org.springframework.boot.bind.RelaxedDataBinder.initializePath(RelaxedDataBinder.java:273) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE] 
at org.springframework.boot.bind.RelaxedDataBinder.initializePath(RelaxedDataBinder.java:308) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE] 
at org.springframework.boot.bind.RelaxedDataBinder.initializePath(RelaxedDataBinder.java:308) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE] 
at org.springframework.boot.bind.RelaxedDataBinder.normalizePath(RelaxedDataBinder.java:259) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE] 
at org.springframework.boot.bind.RelaxedDataBinder.modifyProperty(RelaxedDataBinder.java:240) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE] 
at org.springframework.boot.bind.RelaxedDataBinder.modifyProperties(RelaxedDataBinder.java:155) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE] 
at org.springframework.boot.bind.RelaxedDataBinder.doBind(RelaxedDataBinder.java:128) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE] 
at org.springframework.validation.DataBinder.bind(DataBinder.java:715) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE] 
at org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:269) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE] 
at org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:241) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE] 
at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:334) ~[spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE] 
... 61 common frames omitted 
ある

thingProperties.getLayouts().get(3042).getItemX(); 

のようなものを行うことができます

答えて

2

多くのデバッグの後、ソリューションは非常に簡単になりました。プロパティクラスを次のように変更した場合、それは機能します。

@Component 
@ConfigurationProperties(prefix = "thing") 
public class ThingProperties { 

private Map<String, ThingLayout> layouts = new HashMap<>(); 

public Map<String, ThingLayout> getLayouts() { 
    return layouts; 
} 

public void setLayouts(final Map<String, ThingLayout> layouts) { 
    this.layouts = new HashMap(layouts); 
} 
} 

ここで、ゲッタの外側でレイアウトオブジェクトを初期化しています。

春には、デフォルト値の作成がうまく働いた

org.springframework.beans.AbstractNestablePropertyAccessor#setDefaultValue(org.springframework.beans.AbstractNestablePropertyAccessor.PropertyTokenHolder) 

で各マップキーのデフォルト値を作成しようとしましたが、値が

org.springframework.beans.AbstractNestablePropertyAccessor#setPropertyValue(org.springframework.beans.AbstractNestablePropertyAccessor.PropertyTokenHolder, org.springframework.beans.PropertyValue) 
+0

注Iで正しくマップに設定されていませんでした春のブートでバグレポートを提出しました(https://github.com/spring-projects/spring-boot/issues/5824)。現在の動作が設計通りであることを示唆して、無効とマークされた問題の複製としてクローズされました。 – chesterm8

関連する問題