【问题标题】:How can I Autowire an entity from external Jar?如何从外部 Jar 自动装配实体?
【发布时间】:2020-07-27 12:42:52
【问题描述】:

我是 Spring Boot 的新手,我花了几个小时试图弄清楚为什么当我将我的实体移动到另一个项目时出现错误:“java.lang.TypeNotPresentException: Type net.learn.spring .entity.Book 不存在”。我错过了什么?

这是我的项目结构:

这是我的实体项目结构:

实体项目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:

<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">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.learn</groupId>
  <artifactId>LearningSpringBoot</artifactId>
  <version>0.0.1-SNAPSHOT</version>
    <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</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>net.test</groupId>
            <artifactId>CommonVO</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

控制台输出

【问题讨论】:

  • 另一个项目也是一个Spring Boot项目或一个常规项目。或者换句话说,其他项目是否也使用spring-boot-maven-plugin
  • @m-deinum 不是真的,它只是一个 maven 项目。
  • 如前所述,请添加pom.xml,这也是一个多模块项目,只是一个单独的项目吗?
  • @m-deinum 我已经添加了实体项目 pom

标签: spring spring-boot spring-data-jpa spring-data


【解决方案1】:

你能发布 CommonVO 项目的 pom.xml 文件吗? 另外,我建议您将 EntityScan 注释添加到您的 StartApplication 中,如下所示: @EntityScan("net.learn.spring.entity.*")

用于标识应用启动时扫描实体的基础包。

【讨论】:

    【解决方案2】:

    如下更新你的主类:

    ...
    @SpringBootApplication
    @EntityScan(basePackages = "net.learn.spring.entity")
    public class StartApplication implements CommandLineRunner {
    ...
    

    @EntityScan 告诉 Spring 您将 @Entity 文件保存在哪里(将由持久性上下文使用)。由于您的主类和实体类位于不同的包中,Spring 默认找不到您的实体,需要您显示它们的位置。

    【讨论】:

    • @EntityScan(basePackages = "net.learn.spring.entity") 和@EntityScan("net.learn.spring.entity") 有什么区别
    • @Jose 还有no difference
    【解决方案3】:

    你必须扫描包含实体类的包。

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

    【讨论】:

    • 不正确。实体不是组件。也许@EntityScan 可能会起作用?
    猜你喜欢
    • 2014-12-14
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多