Zar*_*tra 12 java mongodb spring-data
我有一个案例,我有一个简单的POJO,其中有一个长字段,实际上是一个时间戳.
该字段必须位于由ISODate表示的mongo数据库中.
我可以在整个Pojo中编写一个转换器,但由于它只有25个中的一个字段没有多大意义,并且当字段发生变化或者另外一个被添加时,它是另一个错误点.
有没有办法在默认转换服务之后调用默认转换器服务并更改另外两个服务,这将对性能产生很大影响.或者是否有一个默认的Converter接口来覆盖?
什么是最好的做法?
也许有一个注释可以应用于这个领域?
是的,我也可以写一个LongToDate转换器,但这会影响所有POJO,而不仅仅是这一个.
这里的样本POJO:
public class Person {
private long someTimestamp;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
没有转换器,这将是这样的:
{
"_id" : ObjectId("52ae8eede4b0249cde22059e"),
"someTimestamp" : NumberLong(1392714950940)
}
Run Code Online (Sandbox Code Playgroud)
那个结果应该是这样的:
{
"_id" : ObjectId("52ae8eede4b0249cde22059e"),
"someTimestamp" : ISODate("2013-12-23T23:00:00.000Z")
}
Run Code Online (Sandbox Code Playgroud)
当这样的时间戳值在嵌套文档中时,所描述的问题变得更加复杂:
{
"_id" : ObjectId("52ae8eede4b0249cde22059e"),
"items" : [
"someTimestamp" : NumberLong(1392714950940)
]
}
Run Code Online (Sandbox Code Playgroud)
POJO:
public class Person {
private Collection<OtherPojoThatHoldsTimestamps> items;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
也许我应该提到我使用Spring来实现这一目标.(http://projects.spring.io/spring-data-mongodb/)
解决方案一是使用 spring data mongodb 监听器:
package com.rc.user.auth.model.listener;
import com.mongodb.DBObject;
import com.nimbusds.jwt.JWTParser;
import com.rc.user.auth.model.OAuth2AccessTokenEntity;
import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
import org.springframework.data.mongodb.core.mapping.event.AfterConvertEvent;
import org.springframework.data.mongodb.core.mapping.event.BeforeSaveEvent;
import org.springframework.stereotype.Component;
import java.text.ParseException;
@Component
public class OAuth2AccessTokenEntityListener extends AbstractMongoEventListener<OAuth2AccessTokenEntity> {
@Override
public void onBeforeSave(BeforeSaveEvent<OAuth2AccessTokenEntity> event) {
OAuth2AccessTokenEntity oat = event.getSource();
DBObject db = event.getDBObject();
db.put("tokenValue", oat.getJwt().serialize());
}
@Override
public void onAfterConvert(AfterConvertEvent<OAuth2AccessTokenEntity> event) {
OAuth2AccessTokenEntity oat = event.getSource();
DBObject db = event.getDBObject();
try {
oat.setJwt(JWTParser.parse(db.get("tokenValue").toString()));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
解决方案二是使用转换器:
package com.rc.user.auth.model.convert;
import com.nimbusds.jwt.JWT;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.WritingConverter;
@WritingConverter
public class JWTToStringConverter implements Converter<JWT, String> {
@Override
public String convert(JWT jwt) {
return jwt.serialize();
}
}
Run Code Online (Sandbox Code Playgroud)
你不能Converter只为一个类定义 a 。但您可以在@PreLoad吗啡将其映射回您的类之前对这些数据进行处理:
@PreLoad
void convertDate(final DBObject dbObject) {
dbObject.put("someTimestamp", new Date(dbObject.get("someTimestamp")));
}
Run Code Online (Sandbox Code Playgroud)
一些有效的东西应该能让你得到你所需要的。这种方法有一些缺点。
@PreLoad。希望这种情况不会经常发生,因此不会造成太大负担。希望这能让您朝着正确的方向开始。祝你好运。