簡體   English   中英

無效的@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.access$100(PojoCodecProvider.java:41)
    at org.bson.codecs.pojo.PojoCodecProvider$Builder.build(PojoCodecProvider.java:119)

這是我創建注冊表的方式,當我 .build .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);
    }
}

它是超類:

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,因此它們必須保持一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM