Spring 如何从外部Jar自动关联实体?

Spring 如何从外部Jar自动关联实体?,spring,spring-boot,spring-data-jpa,spring-data,Spring,Spring Boot,Spring Data Jpa,Spring Data,我是spring boot新手,我花了几个小时试图弄清楚为什么当我将实体移动到另一个项目时会出现错误:java.lang.TypeNotPresentException:Type net.learn.spring.entity.Book not present。我错过了什么 这是我的项目结构: 这是我的实体项目结构: 实体项目POM: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&qu

我是spring boot新手,我花了几个小时试图弄清楚为什么当我将实体移动到另一个项目时会出现错误:java.lang.TypeNotPresentException:Type net.learn.spring.entity.Book not present。我错过了什么

这是我的项目结构:

这是我的实体项目结构:

实体项目POM:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.mystest</groupId>
    <artifactId>CommonVO</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name> </name>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>2.2.7.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.11.0</version>
        </dependency>
    </dependencies>
</project>
这是我的StartApplication课程:

package net.learn.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import net.learn.spring.entity.Book;
import net.learn.spring.repository.Repository;

@SpringBootApplication
public class StartApplication implements CommandLineRunner{
    
    @Autowired
    private Repository repository;
    
    public static void main(String[] args) {
        SpringApplication spa = new SpringApplication(StartApplication.class);
        spa.run(args);
    }

    @Override
    public void run(String... args) throws Exception {

        repository.save(new Book("Las 1000 y una noches"));
        
    }

}
package net.learn.spring.repository;

import org.springframework.data.repository.CrudRepository;

import net.learn.spring.entity.Book;

public interface Repository extends CrudRepository<Book,Integer>{

}
package net.learn.spring.entity;

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

@Entity
@Table(name = "ta_book")
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    public Book() {
    }

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

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Book [id=");
        builder.append(id);
        builder.append(", name=");
        builder.append(name);
        builder.append("]");
        return builder.toString();
    }

    
}
POM:

控制台输出


您可以发布CommonVO项目的pom.xml文件吗? 此外,我建议您向StartApplication添加EntityScan注释,如下所示: @EntityScannet.learn.spring.entity*


它用于标识在应用程序启动期间扫描实体的基本包。

能否发布CommonVO项目的pom.xml文件? 此外,我建议您向StartApplication添加EntityScan注释,如下所示: @EntityScannet.learn.spring.entity*


它用于标识在应用程序启动期间扫描实体的基本包。

您必须扫描包含实体类的包

@Configuration
@ComponentScan("com.package.external.class")
class Config {
...
}

您必须扫描包含实体类的包

@Configuration
@ComponentScan("com.package.external.class")
class Config {
...
}

更新主类,如下所示:

... @SpringBoot应用程序 @EntityScanbasePackages=net.learn.spring.entity 公共类StartApplication实现CommandLineRunner{ ...
@EntityScan告诉Spring您将@Entity文件保存在哪里,这些文件将由持久性上下文使用。由于您的主类和实体类位于不同的包中,Spring默认情况下无法找到您的实体,需要您显示它们的位置。

更新您的主类,如下所示:

... @SpringBoot应用程序 @EntityScanbasePackages=net.learn.spring.entity 公共类StartApplication实现CommandLineRunner{ ...
@EntityScan告诉Spring您将@Entity文件保存在何处,这些文件将由持久性上下文使用。由于您的主类和实体类位于不同的包中,Spring默认情况下无法找到您的实体,需要您显示它们的位置。

另一个项目是Spring启动项目或常规项目。或者换句话说,另一个项目也使用spring boot maven插件吗?@m-deinum不太可能,它只是一个maven项目。如前所述,请添加pom.xml,这也是一个多模块项目,只是一个单独的项目吗?@m-deinum我已经添加了实体项目pom,另一个项目也是spring boot项目吗一个常规项目。或者换句话说,另一个项目是否也使用spring boot maven插件?@m-deinum不太可能,它只是一个maven项目。如前所述,请添加pom.xml,这也是一个多模块项目,只是一个单独的项目吗?@m-deinum我已经添加了实体项目pomError。实体不是组件。可能@EntityScan可以工作吗?不正确。实体不是组件。可能@EntityScan可以工作吗?@EntityScanbasePackages=net.learn.spring.Entity和@EntityScannet.learn.spring之间有什么区别。entity@Jose@EntityScanbasePackages=net.learn.spring.entity和@EntityScannet.lea之间有什么区别春天。entity@Jose有