MongoTemplate实例不是在spring中创建的
我想尝试spring与MongoDB的集成,为此我做了以下几件事。但MongoTemplate实例的创建和抛出java.lang.NullPointerException的方式并不奏效。 这是我的application-context.xmlMongoTemplate实例不是在spring中创建的,spring,mongodb,spring-data-mongodb,Spring,Mongodb,Spring Data Mongodb,我想尝试spring与MongoDB的集成,为此我做了以下几件事。但MongoTemplate实例的创建和抛出java.lang.NullPointerException的方式并不奏效。 这是我的application-context.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="htt
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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">
<!-- Activate annotation configured components -->
<context:annotation-config/>
<!-- Scan components for annotations within the configured package -->
<context:component-scan base-package="com.jeroenreijn.mongodb.example">
<context:exclude-filter type="annotation" expression="org.springframework.context.annotation.Configuration"/>
</context:component-scan>
<!-- Factory bean that creates the Mongo instance -->
<bean id="mongo" class="com.mongodb.Mongo">
<constructor-arg name="host" value="127.0.0.1" />
<constructor-arg name="port" value="27017" />
</bean>
<!-- Define the MongoTemplate which handles connectivity with MongoDB -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate" depends-on="mongo">
<constructor-arg name="mongo" ref="mongo"/>
<constructor-arg name="databaseName" value="firstMongoDB"/>
</bean>
<!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
</beans>
这是我的模型课:
@Document(collection = "AnotherPersonCollection")
public class PersonImpl implements Person {
private String id;
private String name;
private String surname;
// Constructor
public PersonImpl() {
}
public PersonImpl(String id, String name, String surname) {
this.id = id;
this.name = name;
this.surname = surname;
}
@Override
public String getId() {
return id;
}
@Override
public void setId(String id) {
this.id = id;
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getSurname() {
return surname;
}
@Override
public void setSurname(String surname) {
this.surname = surname;
}
@Override
public String toString() {
return "Person has name " + "Id :" + id + "\n" + name + " \n"
+ "surname :" + surname;
}
}
需要帮助我尝试了一些教程,比如mkyong和其他很多教程,但我没有遇到“mongoTemplate”错误的定义:所以我尝试了这个
更新:这是我的pom.xml
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.discusit</groupId>
<artifactId>MongoDBAppTrail4</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>Trying to create MongoDBApp</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- Log4J -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
<!-- Spring framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<!-- Spring Web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<!-- mongodb java driver -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.11.0</version>
</dependency>
<!-- Spring data mongodb -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
</plugins>
</build>
</project>
在主方法中添加:
ApplicationContext context =
new ClassPathXmlApplicationContext("application-context.xml"); //change xml path as you need.
MMongoTemplate mongoTemplate=context.getBean(MMongoTemplate.class);
由于使用main方法,即跳过在spring上下文中加载bean,因此autowire将无法工作。如前所述,您必须在主类中创建应用程序上下文。要使用autowire,可以将主类定义为Springbean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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">
<!-- your mongodb bean befinitions -->
<bean class="fullpackage.MainApplication"/>
</beans>
我已经找到了阿尤斯的解决方案。我发现了两个错误:
- 您没有正确调用xml文件配置
之前:
ApplicationContext ctx = new GenericXmlApplicationContext("classpath*:application-context.xml");
之后:ApplicationContext ctx = new GenericXmlApplicationContext("classpath:META-INF/applicationContext.xml");
ApplicationContext ctx = new GenericXmlApplicationContext("classpath*:application-context.xml");
ApplicationContext ctx = new GenericXmlApplicationContext("classpath:META-INF/applicationContext.xml");
- 您可以调用ExceptionTranslationPostProcessor。为什么?此调用导致错误。我把它拿走了
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
使用这种方式配置mongodb
AppMongoConfig.class
导入org.springframework.context.annotation.Bean;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.data.mongodb.MongoDbFactory;
导入org.springframework.data.mongodb.core.MongoTemplate;
导入org.springframework.data.mongodb.core.SimpleMongoDbFactory;
导入org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
导入org.springframework.data.mongodb.core.convert.MappingMongoConverter;
导入org.springframework.data.mongodb.core.mapping.MongoMappingContext;
导入com.mongodb.Mongo;
@配置
公共类应用程序配置{
公共@Bean
MongoDbFactory MongoDbFactory()引发异常{
返回新的SimpleMongoDbFactory(新的Mongo(),“测试”);
}
公共@Bean
MongoTemplate MongoTemplate()引发异常{
//移除类
MappingMongoConverter converter=新的MappingMongoConverter(mongoDbFactory(),new MongoMappingContext());
setTypeMapper(新的DefaultMongoTypeMapper(null));
MongoTemplate MongoTemplate=新的MongoTemplate(mongoDbFactory(),转换器);
返回mongoTemplate;
}
}
/-------------------------------------------------------------------------------------------------/
testing-servlet.xml
/---------------------------------------------------------------------------/
@自动连线
私有MongoTemplate MongoTemplate;
@凌驾
公共字符串方法测试(classname对象){//classname更改为您的类名
字符串响应=“失败”;
试一试{
如果(!mongoTemplate.collectionExists(classname.class)){
createCollection(classname.class);
}
mongoTemplate.save(对象);
`答复=“成功”`
}捕获(例外e){
System.out.println(“内部捕捉”);
e、 printStackTrace();//TODO:句柄异常
}
返回响应;
}
尝试了您提到的在线程“main”org.springframework.beans.factory.NoSuchBeanDefinitionException中显示以下异常:在org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:296)中未定义[com.discusit.main.main应用程序]类型的合格bean在org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1125)的com.discusit.main.MainApplication.main(MainApplication.java:37)不知道出了什么问题..为什么在发布之前显示这个错误?我在互联网上搜索这个问题,这是某种错误吗???或者依赖项之间的冲突???请尝试在上下文中列出所有bean。可能是创建某些依赖bean时出错,请在创建ctx后立即使用System.out.println(Arrays.asList(ctx.getBeanDefinitionNames());相同错误:线程“main”org.springframework.beans.factory.NoSuchBeanDefinitionException中的异常:org.springframework.data.mongodb.core.MongoTemplate]类型的合格bean未在org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean中定义(DefaultListableBeanFactory.java:296)在org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1125)的com.discusit.main.MainApplication.main(MainApplication.java:37)@Aayush上,在您的主测试中:ApplicationContext ctx=new-GenericXmlApplicationContext(“ApplicationContext.xml”);MongoOperations MongoOperations=(MongoOperations)ctx.getBean(“mongoTemplate”)代码>@MentorReka感谢您的响应,也尝试了此操作,但同样的错误是“未定义bean名称mongoTemplate”@MentorReka同样的错误不断重复。我已经试过了你的建议,当你发帖子但不起作用时,我又试了一次,谢谢responding@Aayush您可以在github或文件托管网站上发布您的项目吗?@Autowired MongoTemplate MongoTemplate;这是多余的。实际上,您并没有自动连接任何东西,只是从上下文中获取bean并将其分配给局部变量(这是可以的)是的,谢谢,我忘记了删除它(我很快就完成了)。因此,您可以删除上下文中的@Autowired或bean。@非常感谢您的回复。。我在STS中也发现了一些问题,你提到的类路径是我写的,但它仍然没有被接受
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
use this way to configure mongodb
AppMongoConfig.class
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import com.mongodb.Mongo;
@Configuration
public class AppMongoConfig {
public @Bean
MongoDbFactory mongoDbFactory() throws Exception {
return new SimpleMongoDbFactory(new Mongo(), "testing");
}
public @Bean
MongoTemplate mongoTemplate() throws Exception {
//remove _class
MappingMongoConverter converter = new MappingMongoConverter(mongoDbFactory(), new MongoMappingContext());
converter.setTypeMapper(new DefaultMongoTypeMapper(null));
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(), converter);
return mongoTemplate;
}
}
/-------------------------------------------------------------------------------------------------/
testing-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<bean
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
<mongo:mongo host="testing" port="27017">
<mongo:options connections-per-host="100"
threads-allowed-to-block-for-connection-multiplier="5"
max-wait-time="120000000"
connect-timeout="10000000"
socket-keep-alive="true"
socket-timeout="15000000"
auto-connect-retry="true"/>
</mongo:mongo>
<mongo:db-factory dbname="testing"
mongo-ref="mongo" />
<bean id="mongoTypeMapper"
class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
<constructor-arg name="typeKey">
<null />
</constructor-arg>
</bean>
<bean id="mongoMappingContext"
class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
<bean id="mongoConverter"
class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mappingContext" ref="mongoMappingContext" />
<property name="typeMapper" ref="mongoTypeMapper"></property>
</bean>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mongoConverter" ref="mongoConverter" />
<property name="writeResultChecking" value="EXCEPTION" />
</bean>
</beans>
/---------------------------------------------------------------------------/
@Autowired
private MongoTemplate mongoTemplate ;
@Override
public String methodTesting(classname object) { //classname change to your class name
String response="failer";
try {
if (!mongoTemplate.collectionExists(classname.class)) {
mongoTemplate.createCollection(classname.class);
}
mongoTemplate.save(object);
`response="success";`
} catch (Exception e) {
System.out.println("inside catch");
e.printStackTrace(); // TODO: handle exception
}
return response;
}