无效的@BsonCreator 构造函数。预期 class java.lang.String,找到接口 java.util.List
Invalid @BsonCreator constructor. Expected class java.lang.String, found interface java.util.List
我正在尝试使用 POJO 将数据写入 MongoDB,但我似乎无法让它工作。我有很多不同的数据结构,因为我要存储各种类型的图表数据。
让我们从错误开始:
org.bson.codecs.configuration.CodecConfigurationException: Invalid @BsonCreator constructor in BigDecimalDataset. Invalid Property type for 'borderColor'. Expected class java.lang.String, found interface java.util.List.
at org.bson.codecs.pojo.CreatorExecutable.getError(CreatorExecutable.java:145)
at org.bson.codecs.pojo.CreatorExecutable.getError(CreatorExecutable.java:135)
at org.bson.codecs.pojo.ConventionAnnotationImpl.processCreatorAnnotation(ConventionAnnotationImpl.java:200)
at org.bson.codecs.pojo.ConventionAnnotationImpl.apply(ConventionAnnotationImpl.java:53)
at org.bson.codecs.pojo.ClassModelBuilder.build(ClassModelBuilder.java:273)
at org.bson.codecs.pojo.PojoCodecProvider.createClassModel(PojoCodecProvider.java:219)
at org.bson.codecs.pojo.PojoCodecProvider.access0(PojoCodecProvider.java:41)
at org.bson.codecs.pojo.PojoCodecProvider$Builder.build(PojoCodecProvider.java:119)
这是我创建注册表的方式,当我 .build()
PojoCodecProvider
:
时出错
CodecRegistry registry = CodecRegistries.fromRegistries(
MongoClientSettings.getDefaultCodecRegistry(),
CodecRegistries.fromProviders(
PojoCodecProvider.builder()
.register(SystemAMultiSeriesChartData.class)
.register(BigDecimalDataset.class)
.register(SystemASystemInsightsDocument.class)
.register(InsightsDocument.class)
.register(SystemInsights.class)
.register(ChartData.class)
.register(ChartData.Dataset.class)
.register(ChartData.MultiSeriesChartData.class)
.register(GenericInsights.class)
.automatic(true)
.build()
)
);
mongoClient = MongoClients.create(MongoClientSettings.builder()
.codecRegistry(registry)
.applyToClusterSettings(builder
-> builder.hosts(app.getMongoServers()))
.build());
这里是冒犯class:
public class BigDecimalDataset extends ChartData.Dataset<BigDecimal> {
public BigDecimalDataset() {
super(null, null);
}
public BigDecimalDataset(String label) {
super(label, null);
}
public BigDecimalDataset(String label, List<BigDecimal> data) {
super(label, null, data);
}
public BigDecimalDataset(String label, String stack, List<BigDecimal> data) {
super(label, stack, data, new ArrayList<String>(), new ArrayList<String>(), null);
}
@BsonCreator
public BigDecimalDataset(@BsonProperty("label") String label,
@BsonProperty("stack") String stack,
@BsonProperty("data") List<BigDecimal> data,
@BsonProperty("backgroundColor") List<String> backgroundColor,
@BsonProperty("borderColor") List<String> borderColor,
@BsonProperty("borderWidth") String borderWidth) {
super(label, stack, data, backgroundColor, borderColor, borderWidth);
}
}
而且超级棒class:
public static class Dataset<T> {
@BsonProperty("data")
protected List<T> data;
@BsonProperty("label")
protected String label;
@BsonProperty("stack")
protected String stack;
@BsonProperty("backgroundColor")
protected List<String> backgroundColor;
@BsonProperty("borderColor")
protected List<String> borderColor;
@BsonProperty("borderWidth")
protected String borderWidth;
public Dataset() {
this(null, null);
}
public Dataset(String label) {
this(label, null);
}
public Dataset(String label, List<T> data) {
this(label, null, data);
}
public Dataset(String label, String stack, List<T> data) {
this.label = label;
this.stack = stack;
this.data = ListUtil.emptyListIfNull(data);
this.borderColor = new ArrayList<>();
this.backgroundColor = new ArrayList<>();
}
@BsonCreator
public Dataset(@BsonProperty("label") String label,
@BsonProperty("stack") String stack,
@BsonProperty("data") List<T> data,
@BsonProperty("backgroundColor") List<String> backgroundColor,
@BsonProperty("borderColor") List<String> borderColor,
@BsonProperty("borderWidth") String borderWidth) {
this.label = label;
this.stack = stack;
this.data = ListUtil.emptyListIfNull(data);
this.borderColor = borderColor;
this.backgroundColor = backgroundColor;
this.borderWidth = borderWidth;
}
/**
* @return the label
*/
}
}
为什么 List
会成为问题?
更新:
看来方法重载是被禁止的。 Dataset
失败,因为 borderColor
有两个签名(一个是一种方便的方法):
public void setBorderColor(List<String> borderColor) {
this.borderColor = borderColor;
}
public void setBorderColor(String borderColor) {
if (this.borderColor == null) {
this.borderColor = new ArrayList<>();
}
this.borderColor.add(borderColor);
}
MongoDB 的驱动程序对调用哪个 setBorderColor
方法感到困惑。
我用 MongoDB 提交了一个 Jira 问题:https://jira.mongodb.org/browse/JAVA-4508
必须有一个String getBorderColor()
方法。请记住,POJO 处理 getter 和 setter,因此它们必须一致。
我正在尝试使用 POJO 将数据写入 MongoDB,但我似乎无法让它工作。我有很多不同的数据结构,因为我要存储各种类型的图表数据。
让我们从错误开始:
org.bson.codecs.configuration.CodecConfigurationException: Invalid @BsonCreator constructor in BigDecimalDataset. Invalid Property type for 'borderColor'. Expected class java.lang.String, found interface java.util.List.
at org.bson.codecs.pojo.CreatorExecutable.getError(CreatorExecutable.java:145)
at org.bson.codecs.pojo.CreatorExecutable.getError(CreatorExecutable.java:135)
at org.bson.codecs.pojo.ConventionAnnotationImpl.processCreatorAnnotation(ConventionAnnotationImpl.java:200)
at org.bson.codecs.pojo.ConventionAnnotationImpl.apply(ConventionAnnotationImpl.java:53)
at org.bson.codecs.pojo.ClassModelBuilder.build(ClassModelBuilder.java:273)
at org.bson.codecs.pojo.PojoCodecProvider.createClassModel(PojoCodecProvider.java:219)
at org.bson.codecs.pojo.PojoCodecProvider.access0(PojoCodecProvider.java:41)
at org.bson.codecs.pojo.PojoCodecProvider$Builder.build(PojoCodecProvider.java:119)
这是我创建注册表的方式,当我 .build()
PojoCodecProvider
:
CodecRegistry registry = CodecRegistries.fromRegistries(
MongoClientSettings.getDefaultCodecRegistry(),
CodecRegistries.fromProviders(
PojoCodecProvider.builder()
.register(SystemAMultiSeriesChartData.class)
.register(BigDecimalDataset.class)
.register(SystemASystemInsightsDocument.class)
.register(InsightsDocument.class)
.register(SystemInsights.class)
.register(ChartData.class)
.register(ChartData.Dataset.class)
.register(ChartData.MultiSeriesChartData.class)
.register(GenericInsights.class)
.automatic(true)
.build()
)
);
mongoClient = MongoClients.create(MongoClientSettings.builder()
.codecRegistry(registry)
.applyToClusterSettings(builder
-> builder.hosts(app.getMongoServers()))
.build());
这里是冒犯class:
public class BigDecimalDataset extends ChartData.Dataset<BigDecimal> {
public BigDecimalDataset() {
super(null, null);
}
public BigDecimalDataset(String label) {
super(label, null);
}
public BigDecimalDataset(String label, List<BigDecimal> data) {
super(label, null, data);
}
public BigDecimalDataset(String label, String stack, List<BigDecimal> data) {
super(label, stack, data, new ArrayList<String>(), new ArrayList<String>(), null);
}
@BsonCreator
public BigDecimalDataset(@BsonProperty("label") String label,
@BsonProperty("stack") String stack,
@BsonProperty("data") List<BigDecimal> data,
@BsonProperty("backgroundColor") List<String> backgroundColor,
@BsonProperty("borderColor") List<String> borderColor,
@BsonProperty("borderWidth") String borderWidth) {
super(label, stack, data, backgroundColor, borderColor, borderWidth);
}
}
而且超级棒class:
public static class Dataset<T> {
@BsonProperty("data")
protected List<T> data;
@BsonProperty("label")
protected String label;
@BsonProperty("stack")
protected String stack;
@BsonProperty("backgroundColor")
protected List<String> backgroundColor;
@BsonProperty("borderColor")
protected List<String> borderColor;
@BsonProperty("borderWidth")
protected String borderWidth;
public Dataset() {
this(null, null);
}
public Dataset(String label) {
this(label, null);
}
public Dataset(String label, List<T> data) {
this(label, null, data);
}
public Dataset(String label, String stack, List<T> data) {
this.label = label;
this.stack = stack;
this.data = ListUtil.emptyListIfNull(data);
this.borderColor = new ArrayList<>();
this.backgroundColor = new ArrayList<>();
}
@BsonCreator
public Dataset(@BsonProperty("label") String label,
@BsonProperty("stack") String stack,
@BsonProperty("data") List<T> data,
@BsonProperty("backgroundColor") List<String> backgroundColor,
@BsonProperty("borderColor") List<String> borderColor,
@BsonProperty("borderWidth") String borderWidth) {
this.label = label;
this.stack = stack;
this.data = ListUtil.emptyListIfNull(data);
this.borderColor = borderColor;
this.backgroundColor = backgroundColor;
this.borderWidth = borderWidth;
}
/**
* @return the label
*/
}
}
为什么 List
会成为问题?
更新:
看来方法重载是被禁止的。 Dataset
失败,因为 borderColor
有两个签名(一个是一种方便的方法):
public void setBorderColor(List<String> borderColor) {
this.borderColor = borderColor;
}
public void setBorderColor(String borderColor) {
if (this.borderColor == null) {
this.borderColor = new ArrayList<>();
}
this.borderColor.add(borderColor);
}
MongoDB 的驱动程序对调用哪个 setBorderColor
方法感到困惑。
我用 MongoDB 提交了一个 Jira 问题:https://jira.mongodb.org/browse/JAVA-4508
必须有一个String getBorderColor()
方法。请记住,POJO 处理 getter 和 setter,因此它们必须一致。