PersistenceConstructor参数变量名与实例变量名不匹配
我正在尝试将以下对象保留为spring-data-mongodb
version 1.1.1.RELEASE
:
@Documentpublic static class TestObject {
private final int m_property;
@PersistenceConstructor
public TestObject(int a_property) {
m_property = a_property;
}
public int property() {
return m_property;
}
}
MappingException
当我尝试从数据库读回对象时,我得到一个(请参阅下面的完整堆栈跟踪)
我的小组使用的命名约定要求参数变量名称以开头a_
,实例变量名称以开头m_
。似乎spring-data-
mongodb在假设构造函数参数变量名称必须与对象实例变量名称匹配。
- 为什么不
spring-data-mongodb
将构造函数参数用于我在构造函数中定义的实例变量映射? - 有没有另一种方法来定义此映射,从而
spring-data-mongodb
可以正确地构造我的对象,或者我是打破命名约定的唯一选择?
。
Exception in thread "main" org.springframework.data.mapping.model.MappingException: No property a_property found on entity class com.recorder.TestRecorder$TestObject to bind constructor parameter to! at org.springframework.data.mapping.model.PersistentEntityParameterValueProvider.getParameterValue(PersistentEntityParameterValueProvider.java:90)
at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:70)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:229)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:209)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:173)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:169)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:72)
at org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:1820)
at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1542)
at org.springframework.data.mongodb.core.MongoTemplate.findAll(MongoTemplate.java:1064)
at com.recorder.TestRecorder.main(TestRecorder.java:43)
回答:
我们需要依靠构造函数参数名称来匹配字段名称,以找出要拉入文档的哪个字段。如果要@Value("#root.field_name")
在构造函数参数上自定义此用法。
如果您使用带有参数的构造函数让Spring
Data使用该构造函数实例化给定的类,我们必须在调用时将参数传递给该构造函数。为了找出我们必须提交的文档字段,我们需要检查匹配属性以进行潜在的字段名称自定义。请参见以下示例:
@Documentclass MyEntity {
@Field("foo")
private String myField;
public MyEntity(String myField) {
this.myField = myField;
}
}
在这种情况下,我们需要将字段通过管道传递给foo
构造函数,并且如果我们无法以某种方式获得对该属性的引用,则无法找到有关此信息的方法。如果构造函数参数名称有所不同,我们应该如何可靠地找出实际应将哪个字段值用作参数?您在问题中显示的示例
永远无法立即 使用,因为您的文档将包含一个m_property
字段,而且除了添加更明确的配置外,绝对没有办法找出您实际上希望注入的字段。
要自定义此行为,可以使用Spring的@Value
注释并将自定义文档字段注入到构造函数中。该文档本身可通过#root
变量获得。因此,您可以轻松地将上面的示例更改为:
@Documentclass MyEntity {
@Field("foo")
private String myField;
public MyEntity(@Value("#root.foo") String somethingDifferent) {
this.myField = somethingDifferent;
}
}
我强烈建议您向属性中添加自定义字段名称,并且不想将属性命名约定公开给数据库。@Value
在参考文档中简要提到了pf的用法,但是我创建了一个票证来改进文档并使之更加明显。
以上是 PersistenceConstructor参数变量名与实例变量名不匹配 的全部内容, 来源链接: utcz.com/qa/423349.html