【发布时间】:2016-02-16 09:45:34
【问题描述】:
我一直在使用Spring 开发一个Rest API,其中MongoDB 用于数据库。
到目前为止,这是我的代码:
用户.java:
@Id
private String id;
private String firstName;
private String lastName;
private String address;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
UserRepository 接口:
public interface UserRepository extends MongoRepository<User, String>{
}
UserRestController.java:
@RestController
@RequestMapping("/users")
public class UserRestController {
@Autowired
private UserRepository repo;
@RequestMapping(method = RequestMethod.GET)
public List<User> getAll() {
System.out.println("Get Method Invoked");
return repo.findAll();
}
@RequestMapping(method = RequestMethod.POST)
public User create(@RequestBody User user) {
return repo.save(user);
}
@RequestMapping(method = RequestMethod.DELETE, value = "{id}")
public void delete(@PathVariable String id) {
repo.delete(id);
}
}
ServletInitializer 类:
public class ServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
System.out.println("Initializer loaunched");
return new Class[] { MongoSeparateServerConfiguration.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
// TODO Auto-generated method stub
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
配置类:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.cg.mongo")
public class MongoSeparateServerConfiguration {
}
这就是 java 类的全部内容,我运行 MongoDB 实例。当我尝试启动tomcat 服务器时,它给出了一个异常BeanNotFoundException。
如何解决这个问题?
这是我得到的例外:
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRestController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.cg.mongo.service.UserRepository com.cg.mongo.controller.UserRestController.repo; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.cg.mongo.service.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4810)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5255)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
【问题讨论】:
-
似乎找不到合适的 bean 来自动装配。你能写下哪个 bean 无法解析,因为我在屏幕截图上看不到它吗?
-
@NikolayTomitov 我添加了异常。看来它是为 com.cg.mongo.service.UserRepository 来的。不是吗?
-
@SandunkaMihiran 我修正了我的答案,你必须使用 EnableMongoRepositories 和 maven 才能拥有 spring-boot-starter-data-mongodb
标签: java spring mongodb rest spring-mvc