java - 转换失败异常 : Persisting a DBObject but retrieving returns a LinkedHashMap<? , ?>

标签 java mongodb jdbc

我正在持久化一个对象:

@Document
public class PotentialCandidates {

    @Id
    private String jobid;

    @CreatedDate
    private DateTime created;

    @LastModifiedDate
    private DateTime modified;

    private DBObject potentialcandidates;

    public String getJobid() {
        return this.jobid;
    }   
    public void setJobid(String jobid) {
        this.jobid = jobid;
    }

    public DBObject getPotentialcandidates() {
        return this.potentialcandidates;
    }   
    public void setPotentialcandidates(DBObject potentialcandidates) {
        this.potentialcandidates = potentialcandidates;
    }

}

其中 potentialCandidates 是从 JSON 字符串设置的,如下所示:

potentialCandidatesObj.setPotentialcandidates((DBObject)JSON.parse(valStr));

这对我的 mongodb 来说仍然很好,并为我提供了一个数据库上的对象,我可以深入研究,但是当我尝试检索我的数据库对象时:

    public PotentialCandidates getPotentialCandidatesByJobid(String jobid) throws NoSuchPotentialCandidatesException , SystemException{

    PotentialCandidates Jobid = null;
try {
            Query query = new Query();
            query.addCriteria(Criteria.where("_id").is(jobid));
            Jobid = mongoTemplateJobs.findOne(query, PotentialCandidates.class,
                    COLLECTION_NAME);

            return Jobid;
        } catch (Exception ex) {
            throw new SystemException(ex);
        } finally {
            if (Jobid == null) {
                throw new NoSuchPotentialCandidatesException("No User with jobid: "
                        + jobid + "found..");
            }
        }
}

我遇到以下错误:

org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.util.ArrayList<?> to type com.mongodb.DBObject for value 'myString'; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type java.util.LinkedHashMap<?, ?> to type com.mongodb.DBObject

所以我似乎需要某种逻辑来处理来自 mongo 的检索。我可以在我的 findOne 查询中使用不同的返回类,但这看起来有点困惑。是否有处理此问题的标准方法?

最佳答案

你的错误可能正是它在你的异常中所说的:一个 ConversionFailed Exception 由某人/某物试图从 ArrayList 转换为 LinkedHashMap;但是没有合适的转换器(ConverterNotFoundException)。

因为您只发布了很少的代码,所以很难说具体发生在何处。我在你的代码中找不到字符串“myString”,但在错误中提到了它。

Is there a standard approach to dealing with this?

spring data 通常在其映射过程中使用转换器。为了更好地控制映射过程,有些人更喜欢为他们的类实现和注册自定义转换器。

你可以在这里阅读转换器

http://docs.spring.io/spring-data/data-mongo/docs/current/reference/html/mongo.core.html#mongo.custom-converters

这里

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#core-convert

也许这已经足以让您自己修复错误。

编辑:关于这一行的简短评论:

potentialCandidatesObj.setPotentialcandidates((DBObject)JSON.parse(valStr));

您在调用 setter 之前转换为 DBObject,因为 setter 采用 DBObject。这很糟糕,您应该为 JSON 创建另一个 setter 并在那里进行转换,否则您最终将在代码中的任何地方执行该转换操作;那不是很干。

spring data中还有一个叫做DBRefs的东西: 映射框架不必存储嵌入在文档中的子对象。您还可以单独存储它们并使用 DBRef 来引用该文档。当从 MongoDB 加载对象时,这些引用将被立即解析,您将取回一个映射对象,该对象看起来就像嵌入在您的主文档中一样。 与嵌入式 DBObject 相比,您可能更喜欢它。

关于java - 转换失败异常 : Persisting a DBObject but retrieving returns a LinkedHashMap<? , ?>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25511761/

相关文章:

javascript - 创建 NodeJS + Mongo DB MVC,有什么想法如何开始吗?

python - Pyspark - 重用 JDBC 连接

java - 数组数组到表

java - JComboBox 应用程序中的 ArrayIndexOutOfBoundsException

java - Jetty:嵌入还是不嵌入?

java - 如何在 CSV 中提取使用 JDBC 的查询结果

java - 为什么数据库连接一直关闭

java - PreparedStatement 不适用于 Java 中的 Sybase IQ

mongodb - 如何使用自定义结构在 mongo 中进行搜索?

java - mongo 中的所有操作符均使用 Spring