簡體   English   中英

在Spring MVC中自動裝配MongoRepository

[英]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

  1. 使用@NoRepositoryBean批注創建存儲庫接口。
@NoRepositoryBean
public interface MyRepository<T, ID extends Serializable> extends MongoRepository<T, ID> {

}
  1. 創建您的存儲庫實現
public class MyRepositoryImpl<T, ID extends Serializable>
    extends SimpleMongoRepository<T, ID> {

    public PermissableRepositoryImpl(
        final MongoEntityInformation<T, ID> metadata,
        final MongoOperations mongoOperations
    ) {

        super(metadata, mongoOperations);
    }
}
  1. @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)添加@ImportMjurAppConfig配置基本上看起來像:

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM