簡體   English   中英

Spring boot mongodb審計報錯

[英]Spring boot mongodb auditing error

我正在嘗試在我的 Spring Boot 應用程序中配置 mongodb 審計,並且在嘗試保留域類時出現此錯誤:

java.lang.IllegalArgumentException: Couldn't find PersistentEntity for type class com.example.hateoasapi.domain.Post!

來自這里的文檔https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#auditing說所有這些配置都足夠了,但我不知道為什么它在我的項目。 有人可以幫助我嗎?

我的 mongodb 配置類:

    package com.example.hateoasapi.config;


import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.config.EnableMongoAuditing;
import org.springframework.data.mongodb.core.MongoTemplate;

import com.mongodb.MongoClient;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

import java.util.Collection;
import java.util.Collections;


@Configuration
@EnableMongoAuditing
@EnableMongoRepositories(value = "com.example.hateoasapi.repository")
public class MongoConfig extends AbstractMongoConfiguration {

    @Value("${spring.data.mongodb.database}")
    private String databaseName;

    @Value("${spring.data.mongodb.host}")
    private String databaseHost;

    @Value("${spring.data.mongodb.port}")
    private Integer databasePort;

    @Override
    protected String getDatabaseName() {
        return this.databaseName;
    }

    @Bean
    @Override
    public MongoClient mongoClient() {
        return new MongoClient(databaseHost, databasePort);
    }

    @Bean
    public MongoTemplate mongoTemplate() {
        return new MongoTemplate(mongoClient(), databaseName);
    }

    @Override
    protected Collection<String> getMappingBasePackages() {
        return Collections.singleton("com.example.hateoasapi.domain");
    }
}

AuditorAware 實現:

package com.example.hateoasapi.config;


import com.example.hateoasapi.domain.User;
import org.springframework.data.domain.AuditorAware;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Component
public class SecurityAuditor implements AuditorAware<User> {

    @Override
    public Optional<User> getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

        if (authentication == null || !authentication.isAuthenticated()) {
            return null;
        }

        return Optional.of((User) authentication.getPrincipal());
    }
}

我的域類:

package com.example.hateoasapi.domain;

import javax.persistence.Id;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;

import org.joda.time.DateTime;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.mongodb.core.mapping.DBRef;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.hateoas.ResourceSupport;
import com.fasterxml.jackson.annotation.JsonCreator;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*;

import java.io.Serializable;
import java.util.List;

import com.example.hateoasapi.controller.*;

@Getter
@Setter
@ToString
@Document
public class Post extends ResourceSupport implements Serializable {

    @Id
    @Field(value = "_id")
    private String objectId;

    @DBRef
    private List<Comment> comments;

    @DBRef
    private User author;

    @NotBlank
    private String body;

    @NotBlank
    private String title;

    private String categoryId;

    @NotEmpty(message = "Tags cannot be empty")
    private List<PostTag> tags;

    @CreatedDate
    private DateTime createdDate;

    @LastModifiedDate
    private DateTime lastModifiedDate;

    @CreatedBy
    private User createdBy;

    private Long views;    
    private List<PostRating> likes;
    private List<PostRating> dislikes;


    @JsonCreator
    public Post() {}

    public Post(String title, String body) {
        this.body = body;
        this.title = title;
    }

    public Post(User author, String body, String title, String categoryId, List<PostTag> tags) {
        this.author = author;
        this.body = body;
        this.title = title;
        this.categoryId = categoryId;
        this.tags = tags;
    }

    public void addLinks() {
        this.add(linkTo(methodOn(PostController.class).getAllPosts(null)).withSelfRel());
    }
}

我用下一個配置解決了這個問題:

@Configuration
@EnableMongoRepositories(basePackages = "YOUR.PACKAGE")
@EnableMongoAuditing
public class MongoConfig extends AbstractMongoConfiguration {

    @Value("${spring.data.mongodb.host}")
    private String host;

    @Value("${spring.data.mongodb.port}")
    private Integer port;

    @Value("${spring.data.mongodb.database}")
    private String database;

    @Override
    public MongoClient mongoClient() {
        return new MongoClient(host, port);
    }

    @Override
    protected String getDatabaseName() {
        return database;
    }

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {
        return new MongoTemplate(mongoDbFactory(), mappingMongoConverter());
    }

    @Bean
    public MongoDbFactory mongoDbFactory() {
        return new SimpleMongoDbFactory(mongoClient(), database);
    }
}

只需添加豆類的MongoTemplate與構造MongoTemplate(MongoDbFactory mongoDbFactory, @Nullable MongoConverter mongoConverter)

引用JIRA 票證

您還需要通過管道將環境中可用的 MappingMongoConverter 導入 MongoTemplate,即使用 new MongoTemplate(dbFactory, converter)。 您使用的構造函數是為了方便,一次性使用。 我們通常建議使用 AbstractMongoConfiguration 以防您想自定義任何特定於 MongoDB 的內容,因為這可以確保組件正確連接在一起。

更具體地說,您需要注入預配置的 MappingMongoConverter,或者如果您需要使用自己的轉換器,至少使用預配置的 MongoMappingContext。

我在 spring boot 2.2 中也遇到了這個問題,我有@EnableMongoRepositories@EnableMongoAuditing作為配置,但出現錯誤無法找到類型類的 PersistentEntity

就我而言,問題是包的結構:應用程序類的級別低於我使用審計的模型的一部分。

我在許多論壇帖子中發現這兩個注釋在 spring 2.2 中不兼容,但是在重組包之后,我能夠在 spring boot 2.2 中成功使用這兩個注釋

如果您使用最新版本的 Spring Boot (2.0) 和 Spring Data,@EnableMongoAuditing @EnableMongoRepositories 不兼容。 與 EnableReactiveMongoRepositories 注釋相同。

如果你想啟用 mongo 審計,你需要刪除你的 MongoConfig 類,使用配置文件來定義你的 mongodb 連接,一切都會工作。

如果您使用最新版本的 Spring Boot (2.0) 和 Spring Data、@EnableMongoAuditing 和 @EnableMongoRepositories,請嘗試刪除 @EnableMongoRepositories。 它應該只工作這個示例項目 - https://github.com/hantsy/spring-reactive-sample/tree/master/boot-data-mongo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM