Spring boot JPA с другим родителем для сущности и сервиса - PullRequest
0 голосов
/ 06 января 2020

Во-первых, у меня есть два разных проекта maven. Я пытаюсь сохранить два модуля: один для «хранилища и сущностей», а второй для служб. Второй проект содержит только один модуль с «контроллерами». Теперь у меня много проблем, во-первых, «Не управляемый тип» для сущностей. Другое дело, если я храню все в одном модуле или даже в разных модулях с одним родительским проектом, это работает безупречно, однако я просто пытаюсь поместить другой пакет в другой проект и модуль

EntityScan, enablejparepositries и все остальные работают, состояние отладки:

    name: default
    persistence provider classname: null
    classloader: sun.misc.Launcher$AppClassLoader@42a57993
    excludeUnlistedClasses: true
    JTA datasource: null
    Non JTA datasource: HikariDataSource (null)
    Transaction type: RESOURCE_LOCAL
    PU root URL: file:/F:/Software/MavenRepo/com/company/repo/1.0.0/repo-1.0.0.jar
    Shared Cache Mode: UNSPECIFIED
    Validation Mode: AUTO
    Jar files URLs []
    Managed classes names [
        com.company.sitemap.repo.Page]
    Mapping files names []
    Properties []

Однако, наконец, он сообщает Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.company.sitemap.repo.Page и показывает ошибку при запуске приложения. Можете ли вы помочь мне с этим?

Вот мой файл класса приложения

package com.company.sitemap;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

import com.company.sitemap.repo.SitemapRepoConfig;
import com.company.sitemap.service.SitemapConfig;


@SpringBootApplication
@EnableJpaRepositories(basePackageClasses = { SitemapRepoConfig.class })
@EntityScan(basePackages = {"com.nie.learn.sitemap.repo"})
@ComponentScan(basePackageClasses = { SitemapConfig.class, SitemapRepoConfig.class })
public class Sitemap extends SpringBootServletInitializer {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(Sitemap.class, args);
        for (String name : applicationContext.getBeanDefinitionNames()) {
            System.out.println(name);
        }
    }

}

Класс сущности находится в другом проекте и модуле. Скажем, Project-libs и модуль module-repo. Я пытаюсь добавить это как maven зависимость. Файл сущности выглядит следующим образом:

package com.company.sitemap.repo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;



@Entity
public class Page {

Конфигурация репо для сканирования классов репо.

package com.company.sitemap.repo;

import org.springframework.context.annotation.Configuration;

@Configuration

public class SitemapRepoConfig {

}

Конфигурация сервиса для сканирования классов сервиса:

package com.company.sitemap.service;

import javax.validation.constraints.NotNull;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.company.sitemap.repo.PageRepository;

@Configuration
public class SitemapConfig {

    @Bean
    @NotNull
    public SitemapService service(@NotNull PageRepository repo) {
        return new SitemapService(repo);
    }
}

Ответы [ 3 ]

0 голосов
/ 16 января 2020

Я покажу вам пример, который помогает нам в несколько ином случае. Этот тип конфигурации используется для Module1TestConf, чтобы разрешить тестирование отдельных модулей с использованием Spring boot sling (@DataJpaTest, et c.) В нашем многомодульном проекте Gradle, чтобы избежать загрузки всего контекста. Мы просто ограничиваем наш модуль сканирования текущим модулем + дополнительными объектами.

@SpringBootConfiguration
@EnableAutoConfiguration
@EntityScan(
        basePackages = "your.other.module.package.entity",
        basePackageClasses = {SomeEntity1.class, SomeEntity2.class}
)
@ComponentScan(
        value = "your.current.module.package",
        excludeFilters = {
                @ComponentScan.Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter),
                @ComponentScan.Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter)})

Это в основном то, что @SpringBootApplication делает под капотом.

Так что я не на 100% уверен, что это поможет вам. Есть ли веская причина для сохранения проектов в виде отдельных maven-проектов (используйте Gradle! :))?

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

Также попробуйте указать классы сущностей непосредственно в basePackageClasses.

0 голосов
/ 22 января 2020
@SpringBootApplication
@EnableJpaRepositories(basePackageClasses = { com.company.sitemap.repo})
@EntityScan(basePackages = {"com.company.sitemap.repo"})
public class Sitemap extends SpringBootServletInitializer {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(Sitemap.class, args);
        for (String name : applicationContext.getBeanDefinitionNames()) {
            System.out.println(name);
        }
    }

}

Попробуйте приведенную выше конфигурацию.

0 голосов
/ 06 января 2020

Вам необходимо отсканировать пакет, чтобы Spring могла автоматически создавать бобы. Вы определяете Page как боб, но не сканируете его. Для сканирования необходимо добавить

@ComponentScan(basePackages = { "com.nie.learn.*" })

Если вы уже добавили его, проверьте, не помечено ли Page 1006 *, как показано ниже

@javax.persistence.Entity
public class Page {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...