2015-07-15 3 views
2

Я пытаюсь включить Аудит с помощью аннотаций. Мой класс домена имеет поле @Id, которое заполняется при построении объекта. Я добавил поле java.util.Date для lastModified и аннотировал его с помощью @LastModifiedDate.SpringData MongoDB не может определить IsNewStrategy во время аудита

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

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

Я включил аудит в XML Spring конфигурации с использованием <mongo:auditing/>.

При попытке сохранить экземпляр моего объекта, я получаю следующее сообщение об ошибке:

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

java.lang. IllegalArgumentException: Неподдерживаемый объект com.pankaj.Book! Не удалось определить IsNewStrategy.

Я не хочу использовать интерфейс Auditable и не расширять классы домена из AbstractAuditable. Я хочу использовать только аннотации. Поскольку меня не интересуют @CreatedBy и @LastModifiedBy, я также не реализую интерфейс AuditAware.

Я просто хочу, чтобы @LastModifiedDate работал для моих классов домена. Что мне не хватает?

Я использую версию 1.7.0 SpringData MongoDB.

+0

проблема, похоже, дублирование отображенияContext. Посмотрите здесь: https://stackoverflow.com/questions/40738105/spring-data-mongodb-mongoauditing-cause-illegalargumentexception-unsupporte/40764592#comment76784613_40764592 – gba

ответ

0

Мой проект, работающий в версии 1.6.2, работает нормально, за исключением того, что @ LastModifiedDate не обновляется. После обновления до версии 1.7.1. У меня была такая же проблема, как и вы.

Я попытался реализовать класс: org. Springframework. Данные. Домен. Аудитируемый этот интерфейс, по-видимому, может сохранить нормальный, но созданные два и два созданных поля не могут быть сохранены в базе данных.

+0

Не могли бы вы отредактировать свой ответ, чтобы быть немного понятнее. Не уверен, что вы пытаетесь сказать во втором абзаце. –

+0

Запуск моего кода против версии 1.6.2 работает для меня. Обновлен '@ LastModifiedDate', я думаю, обнаружено, что, поскольку' @ Id' не является нулевым, это старый объект, который изменяется. Возможно, в 1.7.0 есть ошибка. – user3458433

+0

Прошу прощения, я из Китая, мой английский ограничен. Я пытаюсь описать ясно. Значение второго абзаца следующее: Я пытаюсь сделать это: Реализованные книги Аудитируемые, больше не выбрасывают это исключение: Неподдерживаемый объект. Ком панкай. Не удалось определить IsNewStrategy. – jingmingji

4

Вы не упомянули, как вы настраиваете соединение MongoDB, но если вы используете AbstractMongoConfiguration, он будет использовать пакет фактического класса конфигурации для поиска аннотированных классов @Document при запуске.

Если ваши объекты находятся в другом пакете, вам придется вручную передать этот пакет, переопределив AbstractMongoConfiguration.getMappingBasePackage(). Размещение этого в вас классе конфигурации Монго должны сделать трюк (опять же, это учитывая, что вы расширяете AbstractMongoConfiguration для вашей конфигурации Монго):

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

Я была такая же проблема, и установила ее, расширив класс документа с AbstractPersistable. В вашем случае это может быть

public class Book extends AbstractAuditable 
2

У меня была такая же проблема, позже я решил, что мне не хватает поля идентификатора с аннотацией;

@Id 
private String Id 

в моем классе я пытался упорствовать с

@Document(collection="collectionName") 
0

Я была такая же проблема при использовании примечаний только конфигурации.

Когда вы добавляете @EnableMongoAuditing в классе конфигурации, Spring создаст компонент MappingContext.

Тогда вы должны убедиться, что в 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; 
    } 
}