[英]Trying to Autowire a Spring Data MongoRepository in Struts2
[英]Autowire MongoRepository in Spring MVC
我想將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
注釋注冊的@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"})
它應該工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.