Spring 在 couchbase 中保存额外信息
Spring saving extra information in couchbase
我正在使用 Spring 在 Couchbase 中保存文档。对于某些字段,添加了额外的信息。
POJO:
@Document public class PlayerTxn implements Serializable {
private static final long serialVersionUID = -2569497126561L;
@Id private String id;
@Field private Date txnDate;
@Field private BigDecimal wagerAmount;
@Field private BigDecimal pointsAwarded;
@Field private String segment;
必需结果:
{ "txnDate": 234234234324, "wagerAmount": 234.33, "pointsAwarded":
23.2, "segment": "xxx" }
最终结果:
{ "_class": "com.app.model.PlayerTxn", "segment":
"xxx", "wagerAmount": {
"intCompact": 24312,
"scale": 2,
"precision": 5,
"stringCache": "243.12" }, "pointsAwarded": {
"intCompact": -9223372036854776000,
"scale": 38,
"precision": 0,
"intVal": {
"signum": 1,
"bitCount": 0,
"mag": [
3800,
-457875904,
-1778440383,
-1805069212,
295579091
],
"lowestSetBit": 0,
"firstNonzeroIntNum": 0,
"bitLength": 0
} }, "txnDate": 1466417747057 }
必须为 BigDecimal 编写自定义转换器。
但文档中仍然添加了“_class”。知道如何删除它吗?
看来您需要为 BigDecimal 值添加自定义转换器,例如:
// extend or add a customized couchbase config like this
public class CustomCouchbaseConfig extends AbstractCouchbaseConfiguration {
@Override
public CustomConversions customConversions() {
return new CustomConversions(Arrays.asList(
BigDecimalToString.INSTANCE,
StringToBigDecimalConverter.INSTANCE));
}
@WritingConverter
public static enum BigDecimalToString implements Converter<BigDecimal, String> {
INSTANCE;
@Override
public String convert(BigDecimal source) {
// or a more appropriate implementation
return source.toString() ;
}
}
@ReadingConverter
public static enum StringToBigDecimalConverter implements Converter<String, BigDecimal> {
INSTANCE;
@Override
public BigDecimal convert(String source) {
return new BigDecimal(source);
}
}
}
确保这些转换器方法是空安全的!
有关详细信息,请参阅 Spring Data Couchbase 参考:
http://docs.spring.io/spring-data/couchbase/docs/2.1.2.RELEASE/reference/html/#datatypes
编辑:
关于 _class
属性,请参阅 this SO question 和 Oliver Giercke 的回答以了解 _class
背后的原因。
该问题针对 MongoDB,但也可以轻松翻译为 Couchbase。
我正在使用 Spring 在 Couchbase 中保存文档。对于某些字段,添加了额外的信息。
POJO:
@Document public class PlayerTxn implements Serializable {
private static final long serialVersionUID = -2569497126561L;
@Id private String id;
@Field private Date txnDate;
@Field private BigDecimal wagerAmount;
@Field private BigDecimal pointsAwarded;
@Field private String segment;
必需结果:
{ "txnDate": 234234234324, "wagerAmount": 234.33, "pointsAwarded":
23.2, "segment": "xxx" }
最终结果:
{ "_class": "com.app.model.PlayerTxn", "segment":
"xxx", "wagerAmount": {
"intCompact": 24312,
"scale": 2,
"precision": 5,
"stringCache": "243.12" }, "pointsAwarded": {
"intCompact": -9223372036854776000,
"scale": 38,
"precision": 0,
"intVal": {
"signum": 1,
"bitCount": 0,
"mag": [
3800,
-457875904,
-1778440383,
-1805069212,
295579091
],
"lowestSetBit": 0,
"firstNonzeroIntNum": 0,
"bitLength": 0
} }, "txnDate": 1466417747057 }
必须为 BigDecimal 编写自定义转换器。
但文档中仍然添加了“_class”。知道如何删除它吗?
看来您需要为 BigDecimal 值添加自定义转换器,例如:
// extend or add a customized couchbase config like this
public class CustomCouchbaseConfig extends AbstractCouchbaseConfiguration {
@Override
public CustomConversions customConversions() {
return new CustomConversions(Arrays.asList(
BigDecimalToString.INSTANCE,
StringToBigDecimalConverter.INSTANCE));
}
@WritingConverter
public static enum BigDecimalToString implements Converter<BigDecimal, String> {
INSTANCE;
@Override
public String convert(BigDecimal source) {
// or a more appropriate implementation
return source.toString() ;
}
}
@ReadingConverter
public static enum StringToBigDecimalConverter implements Converter<String, BigDecimal> {
INSTANCE;
@Override
public BigDecimal convert(String source) {
return new BigDecimal(source);
}
}
}
确保这些转换器方法是空安全的!
有关详细信息,请参阅 Spring Data Couchbase 参考: http://docs.spring.io/spring-data/couchbase/docs/2.1.2.RELEASE/reference/html/#datatypes
编辑:
关于 _class
属性,请参阅 this SO question 和 Oliver Giercke 的回答以了解 _class
背后的原因。
该问题针对 MongoDB,但也可以轻松翻译为 Couchbase。