简体   繁体   English

Spring MVC无法初始化com.mongodb.MongoClient类

[英]Spring MVC Could not initialize class com.mongodb.MongoClient

A java.lang.NoClassDefFoundError arises when trying to create the MongoFactory bean. 尝试创建MongoFactory bean时出现java.lang.NoClassDefFoundError。 It would compile and run without the MongoDbFactory bean. 它将在没有MongoDbFactory bean的情况下编译和运行。

import com.mongodb.MongoClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.authentication.UserCredentials;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.fiddle.spring")
public class AppConfig extends WebMvcConfigurerAdapter {
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");

        return viewResolver;
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }


    @Bean
    public MongoDbFactory mongoDbFactory() throws Exception {
        MongoClient nmc = new MongoClient("127.0.0.1", 27017);
        final String dbName = "dbname";
        return new SimpleMongoDbFactory(nmc, dbName);
    }

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {

        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory());

        return mongoTemplate;

    }
}

The bottom of the stack is 堆栈的底部是

root cause

java.lang.NoClassDefFoundError: Could not initialize class com.mongodb.MongoClient
    com.fiddle.spring.config.AppConfig.mongoDbFactory(AppConfig.java:48)
    com.fiddle.spring.config.AppConfig$$EnhancerBySpringCGLIB$$69146fb3.CGLIB$mongoDbFactory$2(<generated>)
    com.fiddle.spring.config.AppConfig$$EnhancerBySpringCGLIB$$69146fb3$$FastClassBySpringCGLIB$$fe0e5588.invoke(<generated>)
    org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:356)
    com.fiddle.spring.config.AppConfig$$EnhancerBySpringCGLIB$$69146fb3.mongoDbFactory(<generated>)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:498)
    org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
    org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1128)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1022)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:754)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:540)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:789)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:745)

The logic of the bean creation is from https://www.mkyong.com/mongodb/spring-data-mongodb-hello-world-example/ Bean创建的逻辑来自https://www.mkyong.com/mongodb/spring-data-mongodb-hello-world-example/

Even though it is not done for spring web mvc, the logic should integrate correctly, right? 即使Spring Web MVC尚未完成,逻辑也应正确集成,对吗? I am still very new to spring. 我对春天仍然很陌生。

Here is the pom.xml 这是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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>deleted</groupId>
    <artifactId>deleted</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>war</packaging>

    <name>deleted</name>
    <url>http://maven.apache.org</url>
    <properties>
        <java-version>1.8</java-version>
        <org.springframework-version>4.3.4.RELEASE</org.springframework-version>
        <javax.servlet-version>3.1.0</javax.servlet-version>
        <javax.servlet-jstl-version>1.2</javax.servlet-jstl-version>
        <java-mongo-driver-version>3.4.0</java-mongo-driver-version>
        <spring-mongo-version>1.9.5.RELEASE</spring-mongo-version>
        <maven-plugin-compiler-version>3.6.0</maven-plugin-compiler-version>
        <maven-plugin-war-version>3.0.0</maven-plugin-war-version>
        <logger-slf4j-version>1.7.21</logger-slf4j-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-mongodb</artifactId>
            <version>${spring-mongo-version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${javax.servlet-version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>${javax.servlet-jstl-version}</version>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver</artifactId>
            <version>${java-mongo-driver-version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${logger-slf4j-version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${logger-slf4j-version}</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>deleted</finalName>

        <pluginManagement>

            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>${maven-plugin-compiler-version}</version>
                    <configuration>
                        <source>${java-version}</source>
                        <target>${java-version}</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>${maven-plugin-war-version}</version>
                    <configuration>
                        <warSourceDirectory>src/main/webapp</warSourceDirectory>
                        <failOnMissingWebXml>false</failOnMissingWebXml>
                    </configuration>
                </plugin>
            </plugins>

        </pluginManagement>

    </build>
</project>

The error you are getting is because of conflicting mongodb driver version. 您收到的错误是由于mongodb驱动程序版本冲突。 One provided by you and the other spring data mongo db is packaged with. 您提供的一个与另一个spring数据mongo db打包在一起。 You can address this problem in couple of ways. 您可以通过两种方式解决此问题。

You can exclude the mongodb driver dependency from spring data mongodb dependency. 您可以从春季数据mongodb依赖关系中排除mongodb驱动程序依赖关系。

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-mongodb</artifactId>
  <version>${spring-mongo-version}</version>
  <exclusions>
    <exclusion>
       <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver</artifactId>
    </exclusion>
  </exclusions>
</dependency>

Or remove the mongodb driver dependency so spring can use the mongodb driver dependency it is packaged with. 或删除mongodb驱动程序依赖项,以便spring可以使用与打包在一起的mongodb驱动程序依赖项。

<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongodb-driver</artifactId>
  <version>${java-mongo-driver-version}</version>
</dependency>

As a side note its not advisable to upgrade mongodb driver to version other than what spring supports as the changes may not be fully backward compatible. 附带说明一下,不建议将mongodb驱动程序升级到spring支持的版本以外的版本,因为更改可能无法完全向后兼容。 So you are better off using option 2 for now which is removing the mongodb driver dependency and wait for new spring mongo data version where you've support for mongodb driver 3.x versions. 因此,您最好现在使用选项2,该选项将删除mongodb驱动程序依赖项,并等待新的Spring mongo数据版本,该版本已支持mongodb驱动程序3.x版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 com.mongodb.client.MongoClient 和 com.mongodb.MongoClient 的区别 - Differences between com.mongodb.client.MongoClient and com.mongodb.MongoClient 如何使用com.mongodb.MongoClient管理的io.dropwizard.lifecycle.Managed? - How to use io.dropwizard.lifecycle.Managed with com.mongodb.MongoClient? Databricks Notebook Scala Spark Connect to MongoDB Could not initialize class com.mongodb.spark.config.ReadConfig$ - Databricks Notebook Scala Spark Connect to MongoDB Could not initialize class com.mongodb.spark.config.ReadConfig$ Could not initialize class com.mongodb.connection.MongoQueryAnalyzer using mongodb Java driver - Could not initialize class com.mongodb.connection.MongoQueryAnalyzer using mongodb Java driver 无法在Spring中初始化bean类 - Could not initialize bean class in Spring 如何修复“java.lang.NoClassDefFoundError:无法初始化类com.mongodb.MongoClientOptions” - How to fix "java.lang.NoClassDefFoundError: Could not initialize class com.mongodb.MongoClientOptions" 无法在Spring MVC中初始化org.hibernate.validator.engine.ConfigurationImpl类? - Could not initialize class org.hibernate.validator.engine.ConfigurationImpl in spring MVC? NoClassDefFoundError:无法初始化类com.jidesoft.swing.JideSwingUtilities - NoClassDefFoundError: Could not initialize class com.jidesoft.swing.JideSwingUtilities 无法初始化com.h3xstream.findsecbugs.taintanalysis.TaintMethodSummary类 - Could not initialize class com.h3xstream.findsecbugs.taintanalysis.TaintMethodSummary 无法初始化com.avaje.ebean.Ebean类? - Could not initialize class com.avaje.ebean.Ebean?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM