1
votes

Error:

19-Feb-2016 00:00:16.731 SEVERE [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log StandardWrapper.Throwable org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.data.mongodb.core.MongoTemplate com.test.app.service.PersonService.mongoTemplate; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongoTemplate' defined in ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.data.mongodb.core.MongoTemplate]: Constructor threw exception; nested exception is java.lang.NoSuchMethodError: org.springframework.core.convert.support.ConversionServiceFactory.createDefaultConversionService()Lorg/springframework/core/convert/support/GenericConversionService;

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mongo="http://www.springframework.org/schema/data/mongo" 
	xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.2.xsd">

<context:component-scan base-package="com.test.app" />
<mvc:annotation-driven/>
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix">
			<value>/WEB-INF/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>
<!-- Factory bean that creates the Mongo instance -->
	 <bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean">
		<property name="host" value="localhost" />
	</bean>
	
	
	<!-- MongoTemplate for connecting and querying the documents in the database -->
	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
		<constructor-arg name="mongo" ref="mongo" />
		<constructor-arg name="databaseName" value="test" />
	</bean>

	<!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes -->
	<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
	
	<bean id="personController" class="com.test.app.controller.PersonController" />
    <bean id="personService" class="com.test.app.service.PersonService" />
    <bean id="person" class="com.test.app.model.Person" />
	
	
</beans>

I am seeing many posts regarding this error , but no answers to fix this.

2

2 Answers

5
votes

The version of spring-core need match the version of spring-data. Below is my part pom.xml:

  <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-core</artifactId>
       <version>4.2.4.RELEASE</version>
  </dependency>

  <!-- Spring data mongodb -->
  <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-mongodb</artifactId>
      <version>1.8.2.RELEASE</version>
  </dependency>

It's fixed.

1
votes

It's almost the same thing only annotation driven. In the Supplier I'm just casting mongoTemplate (You may not want that). So If you use the spring config everything should work fine.

Regarding your version in XML try creating the mongo factory from SimpleMongoDbFactory with a MongoClient and the database name, Then just give your MongoTemplate bean your factory, and that's it.

Spring Config:

@Configuration
public class SpringConfig {

    @Bean
    public MongoDbFactory mongoDbFactory() throws UnknownHostException{
        return new SimpleMongoDbFactory(new MongoClient(),"games");
    }

    @Bean
    public MongoTemplate mongoTemplate() throws UnknownHostException{
        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory());      
        return mongoTemplate;
    }

}

After that I created a supplier (Google Guava in this case) which may not be needed in your case

public class MongoOperationSupplier implements Supplier<MongoOperations>{
    @Override
    public MongoOperations get() {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        MongoOperations mongoOperation = (MongoOperations) ctx.getBean("mongoTemplate");
        return mongoOperation;
    }
}

An annotated class:

@Document(collection="game_suspicious_event")
public class SuspiciousEvent {
    @Id
    private String id;

    private String apiKey;
    private String userUniqueId;
    private Date date;
    private String ip;
    private String additionalInformation;

    public SuspiciousEvent(){}

    public SuspiciousEvent(String apiKey,String userUniqueId,Date date, String ip, String additionalInformation){
        this.apiKey=apiKey;
        this.userUniqueId=userUniqueId;
        this.date=date;
        this.ip=ip;
        this.additionalInformation=additionalInformation;
    }

    public String getApiKey() {
        return apiKey;  
    }
}

Then to use:

final MongoOperations mo = new MongoOperationSupplier().get();
mo.save(new SuspiciousEvent(......));

Hope it helps.