无法检索文档-Castexception ParameterizedType

时间:2018-06-19 13:49:52

标签: java mongodb morphia

我是mongodb的新手,有点挣扎。我想存储一个包含包含其他对象的HashMap的类。当我存储对象时,它可以正常工作,并且数据库中的文档看起来不错。但是检索文档会导致错误:

Caused by: java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

我的(简化的)类如下:

    @Entity(value = "abbyy_parameters", noClassnameStored = true)
public class AbbyyParameters extends AbstractModifiableMongoBean {
    private String wordListEncoding = DEFAULT_ENCODING;
    private String description;
    private String name;
    private PredefinedProfile predefinedProfile;
    @Embedded
    private CustomProfile customProfile;
    private Parameters wordListActionParameters;

    private Boolean treatBarcodeAsWord;
    private Boolean documentProcessingEnabled;
    private Boolean documentExportEnabled;
    private Integer ocrPageLimit;
    private Boolean highCommaFixEnabled;
    private Double skewAngle;

    private List<RegexBasedLanguage> regexBasedLanguages = new ArrayList<>(2);

    public AbbyyParameters() {
        this.createNewId();
        this.setPredefinedProfile(new PredefinedProfile(PredefinedProfileType.DEFAULT));
        this.setCustomProfile(new CustomProfile());
    }

    public String getWordListEncoding() {
        return wordListEncoding;
    }

    public void setWordListEncoding(String encoding) {
        if (!TangroUtils.isNullOrBlankString(encoding)) {
            this.wordListEncoding = encoding;
        }
    }

    public PredefinedProfile getPredefinedProfile() {
        return predefinedProfile;
    }

    public void setPredefinedProfile(PredefinedProfile profile) {
        if (profile == null) {
            profile = new PredefinedProfile("Default");
        }

        this.predefinedProfile = profile;
    }

    public CustomProfile getCustomProfile() {
        return customProfile;
    }

    public void setCustomProfile(CustomProfile profile) {
        this.customProfile = profile;
    }

    public Optional<Boolean> isBarcodeTreatedAsWord() {
        return Optional.ofNullable(treatBarcodeAsWord);
    }

    public void treatBarcodeAsWord(Boolean treatBarcodeAsWord) {
        this.treatBarcodeAsWord = treatBarcodeAsWord;
    }

    public Optional<Boolean> isDocumentProcessingEnabled() {
        return Optional.ofNullable(documentProcessingEnabled);
    }

    public void enableDocumentProcessing(Boolean enableDocumentProcessing) {
        this.documentProcessingEnabled = enableDocumentProcessing;
    }

    public Optional<Boolean> isDocumentExportEnabled() {
        return Optional.ofNullable(documentExportEnabled);
    }

    public void enableDocumentExport(Boolean exportDocument) {
        this.documentExportEnabled = exportDocument;
    }

    public Optional<String> getDescription() {
        return Optional.ofNullable(description);
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}




@Entity
public class CustomProfile {
    private static final String DEFAULT_FILE_NAME = "custom";

    @Transient
    private String name;

    @Embedded
    private Map<String, ProfileProperties> properties = new HashMap<>(5);

    public CustomProfile() {

    }

    public String getName() {
        return name;
    }

    private void setName (String name) {
        this.name = name;
    }

    public Map<String, ProfileProperties> getProperties() {
        return properties;
    }

    private void setProperties(Map<String, ProfileProperties> properties) {
        this.properties = properties;
    }
}

@Embedded
public class ProfileProperties implements Iterable<ProfileProperty>, Serializable {
    private static final long serialVersionUID = 1L;

    @Embedded
    private List<ProfileProperty> properties = new ArrayList<>(15);

    public List<ProfileProperty> getProperties() {
        return properties;
    }

    public void setProperties(List<ProfileProperty> properties) {
        this.properties = properties;
    }

    public void add(ProfileProperty property) {
        Optional<ProfileProperty> oldPropertyOpt = get(property.getName());

        if (oldPropertyOpt.isPresent()) {
            ProfileProperty oldProperty = oldPropertyOpt.get();
            oldProperty.setValue(property.getValue());
        } else {
            properties.add(property);
        }
    }

    public Optional<ProfileProperty> get(String propertyName) {
        if (propertyName == null) {
            return Optional.empty();
        }

        for(ProfileProperty property : properties) {
            if (propertyName.equals(property.getName())) {
                return Optional.of(property);
            }
        }

        return Optional.empty();
    }

    @Override
    public Iterator<ProfileProperty> iterator() {
        return properties.iterator();
    }
}

@Embedded
public class ProfileProperty implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;
    private String value;

    public ProfileProperty(String name, String value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

我创建了吗啡并告诉它如何映射:

morphia = new Morphia();
    morphia.map(AbbyyParameters.class,
            CustomProfile.class,
            ProfileProperties.class,
            ProfileProperty.class);

将类存储在数据库中后,文档如下所示:

{
"_id" : ObjectId("5b2906a0cac45b8d42bbda91"),
"wordListEncoding" : "ISO-8859-15",
"description" : "",
"name" : "1",
"predefinedProfile" : {
    "type" : "DEFAULT"
},
"customProfile" : {
    "properties" : {
        "PageAnalysisParams" : {
            "properties" : [ 
                {
                    "name" : "DetectBarcodes",
                    "value" : "true"
                }
            ]
        },
        "RecognizerParams" : {
            "properties" : [ 
                {
                    "name" : "TextLanguage",
                    "value" : "English,German,Digits,French,Italian,Spanish,Croatian,Slovak,Bulgarian"
                }
            ]
        }
    }
},
"treatBarcodeAsWord" : false,
"documentExportEnabled" : false,
"creationDate" : ISODate("2018-06-19T13:35:26.019Z"),
"changedDate" : ISODate("2018-06-19T13:35:28.441Z")

}

当我尝试检索文档时,出现以下错误:

Caused by: java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
at org.mongodb.morphia.mapping.EmbeddedMapper.readMap(EmbeddedMapper.java:166)

我进入了代码,所以发现此代码引发了异常:

new EphemeralMappedField((ParameterizedType) mf.getSubType(), mf, mapper);

mf.getSubType()返回ProfileProperties,所以我想我在那里配置错误了吗?

我该怎么做才能检索我的文档?

0 个答案:

没有答案