在审计期间,SpringData MongoDB无法确定IsNewStrategy

时间:2015-07-15 06:09:16

标签: spring-data spring-data-mongodb

我正在尝试使用Annotations启用审核。我的域类具有在构造对象时填充的@Id字段。我为lastModified添加了一个java.util.Date字段,并使用@LastModifiedDate对其进行了注释。

@Document
public class Book {
    @Id
    private String name;
    private String isbn;
    @LastModifiedDate
    private Date lastModified;

    public Book(String name) {
        this.name = name;
    }
}

我已使用<mongo:auditing/>.

在Spring配置XML中启用了审核

当我尝试保存对象的实例时,出现以下错误:

Book book1 = new Book("ABCD");
mongoOps.save(book1);

java.lang.IllegalArgumentException:不支持的实体com.pankaj.Book!无法确定IsNewStrategy。

我不想使用Auditable接口,也不想从AbstractAuditable扩展我的域类。我只想使用Annotations。 由于我对@CreatedBy和@LastModifiedBy不感兴趣,我也没有实现AuditAware接口。

我只想让@LastModifiedDate适用于我的域类。我错过了什么?

我正在使用SpringData MongoDB 1.7.0版。

5 个答案:

答案 0 :(得分:5)

您没有提及如何配置MongoDB连接,但如果您使用的是AbstractMongoConfiguration,它将使用实际配置类的包在启动时查找@Document带注释的类。

如果您的实体位于不同的包中,则必须通过重写AbstractMongoConfiguration.getMappingBasePackage()来手动处理该包。把它放在你的Mongo Configuration类中应该可以解决这个问题(同样,这是考虑你为Mongo配置扩展AbstractMongoConfiguration):

@Override
protected String getMappingBasePackage() {
    return "package.with.my.domain.classes";
}

答案 1 :(得分:2)

我有同样的问题,后来我确定我缺少带注释的ID字段;

@Id
private String Id

在我班上我试图坚持

@Document(collection="collectionName")

答案 2 :(得分:2)

使用仅注释配置时遇到了同样的问题。

当你在配置类上放置@EnableMongoAuditing时,Spring将创建一个MappingContext bean。

然后你必须确保在MongoTemplate中使用相同的mappingContext。

@Configuration
@EnableMongoAuditing
@EnableMongoRepositories(value = "my.repositories.package", mongoTemplateRef = "myMongoTemplate")
class MongoConfig {

    @Autowired
    //Autowiring the MongoMappingContext will supply the same MongoMappingContext as the one used in auditing
    MongoMappingContext mongoMappingContext;

    @Bean
    MongoTemplate myMongoTemplate() {

        String databaseName = "mydbname";
        MongoDbFactory factory = new SimpleMongoDbFactory(mongoClient, databaseName);
        MongoConverter converter = new MappingMongoConverter(factory, mongoMappingContext);
        MongoTemplate mongoTemplate =  new MongoTemplate(factory, converter);
        return mongoTemplate;
    }
}

答案 3 :(得分:0)

我在1.6.2版中运行的项目正常运行,但@ LastModifiedDate不会更新。我更新到1.7.1版之后。我和你有同样的问题。

我试图实现这个类:org。 springframework的。数据。域。 Auditable这个界面,看似可以保存正常,但createdBy和createdDate两个字段无法保存到数据库中。

答案 4 :(得分:0)

我有同样的问题并通过使用AbstractPersistable扩展Document类来修复它。在你的情况下它可以是

public class Book extends AbstractAuditable