【问题标题】:Spring Mongodb- Could not instantiate bean class [java.util.List]: Specified class is an interfaceSpring Mongodb-无法实例化bean类[java.util.List]:指定的类是一个接口
【发布时间】:2013-12-18 19:46:13
【问题描述】:

我的项目正在使用 Spring 数据 mongodb。在我对其中一个包含文档数组的字段的文档进行编辑之前,我没有出现以下错误。它以前工作正常,但现在我不断收到以下错误。

我更新的字段是 Projects POJO 类中的 impapps。我不确定如何清除此错误,我尝试了不同的方法但没有成功。

    SEVERE: Servlet.service() for servlet [appServlet] in context with path [/mongodproject] threw exception [Request processing failed; nested exception is org.springframework.data.mapping.model.MappingInstantiationException: Could not instantiate bean class [java.util.List]: Specified class is an interface] with root cause
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.util.List]: Specified class is an interface
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:101)
    at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:60)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:232)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:212)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readValue(MappingMongoConverter.java:1008)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.access$100(MappingMongoConverter.java:75)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:957)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.getValueInternal(MappingMongoConverter.java:713)

这是我的 POJO 和 Spring Repository 类。

项目 POJO 类

@Document(collection="releases")
 public class Project {
@Id
private String id;
 ......
@Field("impapps")
private List<ImpactedApplications> impapps=new ArrayList<ImpactedApplications>();
    .....getters/setters
}   

ImpactedApplication POJO 类:

public class ImpactedApplications {

@Field("appid")
private String appId;
.....
@Field("repository")
private List<ScriptsRepo> rep=new ArrayList<ScriptsRepo>();
@Field("artifacts")
private List<Artifacts> artifacts=new ArrayList<Artifacts>();
     //getter and setters

}

工件 POJO 类

public class Artifacts {

    @Field("artifacttype")
    private String artifactType;
    @Field("documentlink")
    private String documentLink;
    @Field("arttestphase")
    private String artTestPhase;
    @Field("artifactname")
    private ArtifactsEnums artifactsNames;
    @Field("startdate")
    private String startDate;
    @Field("enddate")
    private String endDate;
    @Field("peerrev")
    private boolean peerReview;
    @Field("busrev")
    private boolean busReview;
    @Field("na")
    private boolean na;

Spring 存储库类

public interface ProjectRepository extends Repository<Project, String> {

Project findById(String id);
List<Project> findByYearAndReleaseMonthNoOrderByProjectNameDesc(String year,String month, Sort sort);
Project findByYearAndReleaseMonthNoAndId(String year, String month,String id);

每当我调用上述方法时,我都会不断收到异常。

以下是我的文档当前的外观。

【问题讨论】:

  • 您要阅读的文档是什么样的?你能检查一下impappsrepositoryartifacts 的值是MongoDB 中的数组吗?如果是这样,read(…) 方法应该运行到typeToUse.isCollectionLike() &amp;&amp; dbo instanceof BasicDBList 子句并为该属性正确创建一个集合。我假设您宁愿找到 not 数组的东西,从而启动实体解析。 PS:您介意正确格式化代码示例吗?使帖子更易于阅读,并且可能会吸引更多人回答。
  • @OliverGierke 感谢您的回复。我已经格式化了我的问题。我附上了document 的图片。 impappa 被创建为数组,artifacts 被创建为数组,repository 当前被创建为空数组。
  • 现在当我看到它关闭时..我看到impapps 正在存储为文档而不是文档数组..我认为我的代码中有问题。当我编辑 impapps 时,它看起来不像存储为数组而是作为文档。
  • @OliverGierke 既然你在这里..你能告诉我更新数组中现有文档的正确方法是什么..我试过这个,但它只是将它替换为文档。 Criteria crit=new Criteria().andOperator( Criteria.where("_id").is(projectId), Criteria.where("impapps.appid").is(impapp.getAppId()) );Query query=new Query(crit);Update upd=new Update(); upd.set("impapps", impapp);mongoTemplate.updateFirst(query, upd, Project.class)
  • @OliverGierke 没关系,先生。我通过添加 $ 符号得到它。感谢您查看帖子。你有很棒的假期!

标签: java mongodb spring-data spring-data-mongodb


【解决方案1】:

文档中的impapps 字段不是数组,而是嵌套文档。因此,如果您将 List&lt;ImpactedApplications&gt; 更改为简单的 ImpactedApplications,这应该没问题。

【讨论】:

    【解决方案2】:

    我也有同样的例外:

    尝试像这样声明您的字段:

    @Field("impapps")
    ArrayList<ImpactedApplications> impapps = new ArrayList<ImpactedApplications>();
    

    我不喜欢这样做,但它对我有用。

    编辑:

    我的问题是由于聚合期间的展开操作。 它将数组(在我的类中声明为 List )转换为对象 然后反射不起作用,因为 spring 期待一个列表。

    【讨论】:

      猜你喜欢
      • 2014-09-20
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多