我想将MongoRepository自动装入我的服务类,但我无法做到这一点。我正在使用java配置。这是我的存储库类:
@Repository
public interface UserRepository extends MongoRepository<User, String> {
public User findByFirstName(String firstName);
public List<User> findByLastName(String lastName);
}
这是使用UserRepository的服务:
@Service
public class TestService {
@Autowired
private UserRepository repository;
public void save(User user) {
repository.save(user);
}
}
这是我使用服务的Controller的一部分:
@Controller
public class TestController {
@Autowired
private TestService service;
我的主要java配置类看起来像这样:
@Configuration
@EnableWebMvc
@EnableMongoRepositories
@Import({MjurAppConfig.class, MongoConfiguration.class})
@ComponentScan({"prv.makro.mjur.controller"})
public class MjurWebAppConfig extends WebMvcConfigurerAdapter {
MjurAppConfig:
@Configuration
@ComponentScan({"prv.makro.mjur.dao", "prv.makro.mjur.repository"})
public class MjurAppConfig {
@Bean
public User getUser() {
return new User();
}
@Bean
public TestService getTestService() {
return new TestService();
}
}
和mongo配置:
@Configuration
public class MongoConfiguration {
@Bean
public MongoFactoryBean mongo() {
MongoFactoryBean mongo = new MongoFactoryBean();
mongo.setHost("localhost");
mongo.setPort(27017);
return mongo;
}
@Bean
public MongoTemplate mongoTemplate() throws Exception{
return new MongoTemplate(mongo().getObject(),"mjur");
}
}
例外:
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private prv.makro.mjur.repository.UserRepository
prv.makro.mjur.service.impl.FirstService.repository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [prv.makro.mjur.repository.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)}
我正在寻找这个问题的解决方案,但我找不到任何东西。 IMO组件扫描应该找到存储库,它应该将它绑定到spring上下文。可悲的是,它并没有像那样工作。
好吧,问题出在@EnableMongoRepositories
注释上。
当我将包名添加到它的正文时(所以它看起来像:
@EnableMongoRepositories({"prv.makro.mjur.repository"}) )
我能够自动装配我的UserRepository
@NoRepositoryBean
批注创建存储库界面。@NoRepositoryBean
public interface MyRepository<T, ID extends Serializable> extends MongoRepository<T, ID> {
}
public class MyRepositoryImpl<T, ID extends Serializable>
extends SimpleMongoRepository<T, ID> {
public PermissableRepositoryImpl(
final MongoEntityInformation<T, ID> metadata,
final MongoOperations mongoOperations
) {
super(metadata, mongoOperations);
}
}
@EnableMongoRepository
批注添加到相应的Configuration或Application类。@ComponentScan(basePackages = {"com.company"})
@EnableMongoRepositories(repositoryBaseClass = MyRepositoryImpl.class)
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
public static void main(final String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected final SpringApplicationBuilder configure(final SpringApplicationBuilder applicationBuilder) {
return applicationBuilder.sources(Application.class);
}
}
编辑(在邮政编码的评论和祭坛之后)
发生这种情况是因为Spring Web应用程序有2个上下文:1是根上下文,另一个是Web上下文(由@EnableWebMvc
注释注册的上下文)。
请执行以下操作:
1)从你的@Import
中删除MjurWebAppConfig
注释 - 记住这是你的网络环境。 2)在@Import
配置中添加MjurAppConfig
基本上看起来像:
@Configuration
@Import({MongoConfiguration.class})
@ComponentScan({"prv.makro.mjur.dao", "prv.makro.mjur.repository"})
public class MjurAppConfig {
//..
这些步骤应该使您的服务bean中的自动装配的DAO bean可见。
在编辑之前:
我敢打赌你的TestService
bean在包prv.makro.mjur.service
下由组件扫描注释判断:
@ComponentScan({"prv.makro.mjur.controller"})
换句话说,@ComponentScan
无法看到您的TestService注册@Autowired
依赖项。
如果您执行以下操作,请确保组件扫描可以看到TestService
,并且在上述假设下:
@ComponentScan({"prv.makro.mjur"})
它应该工作。