自动装配的mongo存储库对象在Application类外部为空

时间:2017-03-01 20:20:17

标签: mongodb spring-boot autowired mongorepository

许多类似的问题,但这些解决方案都没有对我有用。我有一个扩展MondoRepository的Repository接口。

public interface Repository extends MongoRepository<Subject, String> {
    Subject findByName(String name);
}

这是主题课

public class Subject {
    @Id
    private String id;

    private String name;

    public String getName() {
        return this.name;
    }
}

上面的两个文件位于/db

如果我在我的Application类中自动装配Repository,我就能正确使用它。

@SpringBootApplication
@Configuration
@EnableAutoConfiguration
@EnableMongoRepositories(basePackageClasses=Repository.class )
public class Application implements CommandLineRunner{

@Bean
public Service service() {
    return new Service();
}

@Autowired
private Repository repository;

@Override
public void run(String... args) throws Exception {

    repository.save(new Subject());

    Subject subject = repository.findByName("hello");

}

public static void main(String[] args) {

    SpringApplication.run(Application.class, args);
}
}

我的Application课程位于根文件夹/中。

基本上,这没有给我任何错误。但是,如果我在像这样的服务类中自动启动它

public class Service {

@Autowired
private Repository repository;

public String get() {
    repository.findByName("hello");

    return "";
}
}

这给了我repository.findByName()行中的空指针异常。 我的Service课程位于/service个包中。

为什么它在应用程序类中的行为不一样? 为了能够在服务类中使用存储库,我应该做些什么?

我尝试了什么 -
我尝试用Service注释我的@Service, @Repository, @Component课程,但没有一个工作。

我尝试为@ComponentScan(basePackageClasses = Service.name)课程添加语音Application,但它没有用。

任何解决方法都很好 -

1 个答案:

答案 0 :(得分:1)

也许是因为存储库或服务还没有被春天扫描过?你注释为@service,@存储库还是@component?

这些对我有用:

@SpringBootApplication
@EnableMongoRepositories
public class DemoApplication implements CommandLineRunner{

    @Autowired
    private Service service;


    @Override
    public void run(String... args) throws Exception {

        String subject = service.get();
        System.out.println("Hola" + subject);
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

@org.springframework.stereotype.Service
public class Service {
    @Autowired
    private Repository repository;

    public String get() {
        repository.findByName("hello");

        return "";
    }
}