【问题标题】:Parameter 0 of constructor in com.demo.service.NmpAppService required a bean named 'entityManagerFactory' that could not be foundcom.demo.service.NmpAppService 中构造函数的参数 0 需要一个名为“entityManagerFactory”的 bean,但找不到该 bean
【发布时间】:2020-02-21 13:44:29
【问题描述】:

我正在尝试在 java spring 中运行一个简单的 api 流,但出现以下错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.nmp.bts.webapps.bsc.btbsc.service.NmpAppService required a bean named 'entityManagerFactory' that could not be found.


Action:

Consider defining a bean named 'entityManagerFactory' in your configuration.> 
<Oct 25, 2019 10:37:51 AM EEST> <Notice> <Stdout> <BEA-000000> <WARN: The method class org.apache.commons.logging.impl.SLF4JLogFactory#release() was invoked.> 
<Oct 25, 2019 10:37:51 AM EEST> <Notice> <Stdout> <BEA-000000> <WARN: Please see http://www.slf4j.org/codes.html#release for an explanation.> 
<Oct 25, 2019 10:37:51 AM EEST> <Error> <Deployer> <BEA-149265> <Failure occurred in the execution of deployment request with ID "48455312047066616" for task "216" on [partition-name: DOMAIN]. Error is: "weblogic.application.ModuleException: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available"
weblogic.application.ModuleException: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
    at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140)
    at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
    at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:237)
    at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:232)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45)
    Truncated. see log file for complete stacktrace
Caused By: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:687)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1207)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
    Truncated. see log file for complete stacktrace

我想提一下,我已经尝试了从 stackoverflow 上其他类似主题开始的所有类型的东西,以改变依赖关系,但对我没有任何作用。

控制器类:NmpAppController.java

@RestController
@RequestMapping("/api")
public class NmpAppController {

    private final NmpAppService nmpAppService;

    @Autowired
    public NmpAppController(NmpAppService nmpAppService) {
        this.nmpAppService = nmpAppService;
    }

    @GetMapping("/nmp-apps")
    public List<NmpApp> getAllNmps() {
        try {
            return nmpAppService.getAllNmpApps();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

服务类:NmpAppService.java

@Service
public class NmpAppService {

    private final NmpAppRepository nmpAppRepository;

    public NmpAppService(NmpAppRepository nmpAppRepository) {
        this.nmpAppRepository = nmpAppRepository;
    }

    public NmpApp save(final NmpApp nmpApp) {

        final NmpApp nmpAppToBeSaved = nmpApp;
        NmpApp result = nmpAppRepository.saveAndFlush(nmpAppToBeSaved);
        return result;
    }

    public NmpApp update(final NmpApp nmpApp) {

        final NmpApp nmpAppitToBeSaved = nmpApp;
        NmpApp result = nmpAppRepository.saveAndFlush(nmpAppToBeSaved);
        return result;
    }

    public List<NmpApp> getAllNmpApps() {
        return nmpAppRepository.findAll();
    }

存储库类:NmpAppRepository.java

@Repository
public interface NmpAppRepository extends JpaRepository<NmpApp, Long> {

}

域类 NmpApp.java

@Entity
@Table(name = "NMP_APP")
public class NmpApp {

    @Id
    @Column(name = "SEQ_NO")
    private Long seqNo;

    @Column(name = "HIST_DATE")
    private Long histDate;

    public NmpApp() {
    }

    public NmpApp(Long seqNo, Long histDate) {
    this.seqNo = seqNo;
    this.histDate = histDate;
    }

    public Long getSeqNo() {
        return seqNo;
    }

    public void setSeqNo(Long seqNo) {
        this.seqNo = seqNo;
    }

    public Long getHistDate() {
        return histDate;
    }

    public void setHistDate(Long histDate) {
        this.histDate = histDate;
    }

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.nmp.bts.webapps.bsc</groupId>
    <artifactId>nm-app</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>bt-bsc</name>
    <description>BSC</description>
    <packaging>war</packaging>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--<dependency>-->
            <!--<groupId>org.springframework.boot</groupId>-->
            <!--<artifactId>spring-boot-starter-data-jdbc</artifactId>-->
        <!--</dependency>-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <archive>
                        <manifest>
                            <addDefaultImplementationEntries>false</addDefaultImplementationEntries>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Spring boot 主类:Application.java

@EnableTransactionManagement
@SpringBootApplication(exclude = {HibernateJpaAutoConfiguration.class})
public class Application extends SpringBootServletInitializer implements WebApplicationInitializer {

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

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.getSessionCookieConfig().setHttpOnly(false);
        super.onStartup(servletContext);
    }

}

稍后编辑:我上传了 application.properties 文件

#Basic Spring Boot Config for Oracle
spring.datasource.url= jdbc:oracle:thin:@//:/
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.jndi-name=jdbc/DEV_ADF_APPLDS
#hibernate config
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
spring.main.allow-bean-definition-overriding=true

我希望能够通过 swagger api 调用程序对数据库执行简单的 CRUD 操作(代码仅显示 getAll,但我确实拥有其余代码)。

【问题讨论】:

  • 您需要 JPA 但不包括 JPA 自动配置。
  • 你能说得更准确点吗?
  • 您排除了HibernateJpaAutoConfiguration,因此排除了JPA,但想使用JPA。
  • 所以现在我收到了org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.jboss.logging.Logger.debugf(Ljava/lang/String;I)V
  • pom.xml 中删除war 插件,Spring Boot 会处理这个问题,以及已经通过spring-boot-starter-web 依赖项添加的servlet-api 依赖项。 @EnableTransactionManagent 不需要,因为 Spring Boot 已经添加了它。在部署到 Weblogic 时,请确保您还添加了一个 Web 逻辑部署描述符来配置类加载(否则它可能会选择 Weblogic 附带的 Spring 而不是您自己的应用程序)。最后,这真的是您正在使用的pom.xml,还是在真正的pom.xml 中还有更多?

标签: spring hibernate rest jpa autowired


【解决方案1】:

代替 spring-boot-starter-data-rest,尝试使用以下

"org.springframework.boot:spring-boot-starter-data-jpa"
"org.springframework.boot:spring-boot-starter-jdbc"

稍后编辑:另外,不要忘记在spring boot主类或数据库配置类上添加@EnableTransactionManagement

【讨论】:

  • 后来的编辑回复:我上传了你说的带注释的spring boot类,但我仍然面临同样的错误
  • @Deinum 有什么建议吗?
  • 查看我在上面发布的答案。这应该可以解决您的问题
【解决方案2】:

通常在 Spring 缺少 spring-boot-starter-data-jpa 时发生,因为 Spring 从 Spring Data JPA 推断出 EntityManager,Hibernate ORM 具有开箱即用的实现。 将以下内容添加到项目pom.xml 通常可以解决此问题

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

但在你的情况下是可用的,所以有问题的代码是

spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect

改成

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

【讨论】:

    猜你喜欢
    • 2019-10-20
    • 2021-12-10
    • 2023-02-07
    • 2023-02-05
    • 2019-03-21
    • 2018-12-06
    • 1970-01-01
    • 2022-08-11
    • 2021-02-02
    相关资源
    最近更新 更多