Конечные точки REST репозиториев, которые расширяют MongoRepository, не сопоставляются

Я реализовал репозитории данных Spring, которые расширяют MongoRepository с аннотацией @RepositoryRestResource, чтобы пометить их как конечные точки REST. Но когда идентификатор запроса сопоставляется, возникает следующее исключение

java.lang.IllegalArgumentException: Couldn't find PersistentEntity for type class io.sample.crm.models.Merchant!

Репозиторий:

@RepositoryRestResource(collectionResourceRel = "account",path = "account")
public interface MerchantRepository extends MongoRepository<Merchant,String> { 

}

Запрос GET я пытаюсь:

http://localhost:9090/crm/account/

Ответ :

{
"cause": null,
"message": "Couldn't find PersistentEntity for type class io.apptizer.crm.apptizercrmservice.models.Merchant!"
}

Кроме того, я настроил две базы данных для каждого моего репозитория.

Файл приложения.yml:

spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration

mongodb:
   primary:
     host: 127.0.0.1
     port: 27017
     database: db_sample_admin_crm
      rest:
        base-path: /crm
   secondary:
     host: 127.0.0.1
     port: 27017
     database: sample_lead_forms
       rest:
         base-path: /reports

Основной класс:

@SpringBootApplication(scanBasePackages = "io.example")
@Configuration
@ComponentScan({"io.example"})
@EntityScan("io.example")
public class App {

public static void main(String[] args) throws Exception {
    SpringApplication.run(App.class, args);
    InitAuth.initialize();
    InitAuth.generateToken();
  }
}

Что здесь может пойти не так?


person GeekySelene    schedule 15.05.2019    source источник
comment
Почему в вашем URL есть crm? localhost:9090/crm/account/...не может это быть localhost:9090/account??   -  person MSD    schedule 15.05.2019
comment
надеюсь, это поможет: stackoverflow.com/q/22824840/2987755,   -  person dkb    schedule 15.05.2019
comment
Путь @MSD правильный с base-path: /crm   -  person dkb    schedule 15.05.2019
comment
Просто предположение, есть ли какие-либо данные в коллекции Merchant, если нет, попробуйте добавить какой-нибудь фиктивный и проверить   -  person dkb    schedule 15.05.2019
comment
извините, я думаю, что базовый URL-адрес не настроен. Поэтому я попытался с localhost:9090/account . Затем он выдал мне эту ошибку «причина: ноль, сообщение: не удалось найти PersistentEntity для класса типов io.apptizer.crm.apptizercrmservice.models.Merchant!»   -  person GeekySelene    schedule 15.05.2019
comment
@dkb в документе БД есть фиктивные данные   -  person GeekySelene    schedule 15.05.2019
comment
RepositoryRestResource точно не помечает конечную точку как REST, он настраивает сопоставление экспорта и ссылки. Начните с просмотра журнала запуска вашего приложения, если он дает вам список сопоставленных URL-адресов.   -  person Marc Tarin    schedule 15.05.2019
comment
@MarcTarin отображается без базового URL. Но проблема теперь получает новое исключение. я обновил вопрос   -  person GeekySelene    schedule 15.05.2019


Ответы (2)


Когда у меня возникла такая же проблема, я изменил @Id на тип Long.

Убедитесь, что ваш extends MongoRepository<Merchant,String> совпадает с типом идентификатора Merchant.

person 윤현구    schedule 15.05.2019
comment
Извините за простую публикацию, я не мог написать комментарий. :( - person 윤현구; 15.05.2019
comment
Получение этого ответа. сообщение: Не найден преобразователь, способный преобразовать тип [org.bson.types.ObjectId] в тип [java.lang.Long], - person GeekySelene; 15.05.2019
comment
Это означает, что тип неверен везде. проверьте тип столбца БД. - person 윤현구; 15.05.2019
comment
Хм, дело в том, что я хочу сохранить его как идентификатор типа String - person GeekySelene; 15.05.2019
comment
Итак, в вашем первоначальном вопросе вы унаследовали и изменили AbstractMongoConfiguration? - person 윤현구; 15.05.2019

Сначала проверьте, правильно ли добавлены все зависимости. Необходимы следующие зависимости:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
         </dependency>

Ответ об ошибке показывает, что Couldn't find PersistentEntity for type class io.apptizer.crm.apptizercrmservice.models.Merchant! , поэтому класс Merchant может отсутствовать в пути к классам, а объект домена не идентифицируется Spring. Попробуйте предоставить класс сущности для продавца, например:

public class Merchant{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String firstName;
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

@RepositoryRestResource(collectionResourceRel = "account", path = "account")
public interface MerchantRepository extends MongoRepository<Merchant, String> {

    List<Person> findByLastName(@Param("name") String name);

}

После этого проверьте, правильно ли вы предоставили все аннотации. Попробуйте добавить контроллер в сканирование компонентов в основном приложении:

@SpringBootApplication
@EnableMongoRepositories("com.example.MerchantRepository")
@ComponentScan(basePackages = {"com.example"})
@EntityScan("com.example.mongo.Merchant")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@ComponentScan указывает Spring искать в пакете другие компоненты, конфигурации и сервисы, что позволяет найти контроллеры.

См. здесь.

person Ananthapadmanabhan    schedule 15.05.2019
comment
'spring-boot-starter-data-jpa' это необходимо? Потому что я использую MongoRepository здесь - person GeekySelene; 15.05.2019
comment
Извините, нет, в этом нет необходимости. Обновили ответ для репозитория mongo. - person Ananthapadmanabhan; 15.05.2019