我正在使用Spring Data通过MongoRepository将POJO持久化为MongoDB中的文档。看起来Spring自动将字段和getter都持久化到MongoDB中。
通常情况下,我希望它只持久化getter,而不会自动持久化字段。我知道@Transient可以用于一次性注解,但希望将其配置为通用行为。
是否有方法可以进行配置?
我正在使用Spring Data通过MongoRepository将POJO持久化为MongoDB中的文档。看起来Spring自动将字段和getter都持久化到MongoDB中。
通常情况下,我希望它只持久化getter,而不会自动持久化字段。我知道@Transient可以用于一次性注解,但希望将其配置为通用行为。
是否有方法可以进行配置?
你可以通过编写自己的自定义转换器来实现。
你在问题中提到spring data mongodb持久化字段和getter。据我所知,只有字段被持久化。(请参见文档11.1:http://docs.spring.io/spring-data/mongodb/docs/1.6.3.RELEASE/reference/html/#mapping-conventions (1.6.3是由spring-boot 1.2.6提供的版本,但在旧版本和1.8.0中也是相同的))
或者一个简短的例子:
如果你有一个像这样的Pojo:
@Document
public class MyClass
{
private ObjectId id;
private String foo = "foo";
public String getBar()
{
return "bar";
}
}
还有像这样的代码仓库:
public interface MyClassRepository extends MongoRepository<MyClass,ObjectId>
{
}
以及像这样的应用程序代码:
public static void main(String[] args) throws UnknownHostException
{
ApplicationContext ctx = SpringApplication.run(NewClass.class, args);
MongoTemplate mongoTemplate = ctx.getBean(MongoTemplate.class);
MyClass myClass = new MyClass();
mongoTemplate.save(myClass);
MyClassRepository myClassRepository = ctx.getBean(MyClassRepository.class);
myClassRepository.save(myClass);
}
以下文件已保存(先由模板保存,然后再由存储库保存):
{
"_id" : ObjectId("560b97edcb60110890ab7119"),
"_class" : "sandbox.MyClass",
"foo" : "foo"
}
所以,getter方法没有被用于转换MyClass对象。
与上述引用的相同文档展示了如何编写自己的转换器并将其注册到MongoTemplate(第8.10节)。您可以在此处编写一些代码,使用类的已声明getter方法,并将它们映射到文档的字段上。