..... Spring Boot中构造函数的参数0

时间:2018-05-18 13:15:57

标签: java spring-boot

启动我的应用时遇到问题。有人可以帮我解决这个问题吗?

Parameter 0 of constructor in com.journaldev.elasticsearch.service.BookServiceImpl required a bean of type 'com.journaldev.elasticsearch.dao.search.BookRepositorySearch' that could not be found.
Action:
Consider defining a bean of type 'com.journaldev.elasticsearch.dao.search.BookRepositorySearch' in your configuration.

GenericRepository

public interface GenericRepository<T, K> {
  Map<String, Object> get(final K id);
}

GenericRepositoryImpl

public class GenericRepositoryImpl<T, K extends Serializable> implements GenericRepository<T, K> { 

  private RestHighLevelClient restHighLevelClient;

  private ObjectMapper objectMapper;

  public GenericRepositoryImpl(ObjectMapper objectMapper, RestHighLevelClient restHighLevelClient) {
    this.objectMapper = objectMapper;
    this.restHighLevelClient = restHighLevelClient;
  }

  @Override
  public Map<String, Object> get(K id) {
    return null;
  }
}

BookRepositorySearch

@Component
public interface BookRepositorySearch extends GenericRepository<Book, Long> {}

BookService

public interface BookService {
  Map<String, Object> get(final Long id);    
}

BookServiceImpl

@Service
public class BookServiceImpl implements BookService {

  private final BookRepositorySearch bookRepositorySearch;

  public BookServiceImpl(BookRepositorySearch bookRepositorySearch) {
    this.bookRepositorySearch = bookRepositorySearch;
  }      
  @Override
  public Map<String, Object> get(Long id) {
    return null;
  }
}

4 个答案:

答案 0 :(得分:1)

如何将类继承为接口?

  @Component 
  public interface BookRepositorySearch extends GenericRepository<Book, Long> {}

使用课程更改此界面,然后重试。

  @Component
  public class BookRepositorySearch extends GenericRepository<Book, Long> {}

答案 1 :(得分:1)

根据您之前的评论,您希望将BookRepositorySearch保留为界面。如果是这种情况,您需要创建该接口的具体实例并将@Component放在该接口上。

您的接口声明中不需要@Component,也不能在接口中扩展类。

public interface BookRepositorySearch {}

创建一个实现接口的具体类型,并扩展您想要自动装配的GenericRepository<Book, Long>并将@Component放在其上:

@Component
public class BookRepositorySearchImpl 
    implements BookRepositorySearch 
    extends GenericRepository<Book, Long>  
{}

https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-class-ctor

  

使用构造函数进行实例化

     

当您通过创建bean时   构造函数方法,所有正常类都可以使用和兼容   与春天。也就是说,正在开发的类不需要   实现任何特定的接口或以特定的方式编码   时尚。简单地指定bean类就足够了。然而,   根据您对特定bean使用的IoC类型,您可以   需要一个默认(空)构造函数。

     

Spring IoC容器几乎可以管理您想要的任何类   管理;它不仅限于管理真正的JavaBeans。最春天   用户更喜欢只有默认(无参数)的实际JavaBeans   构造函数和适当的setter和getter建模之后   容器中的属性。你也可以有更多的异国情调   容器中的非bean样式类。例如,如果您需要   使用绝对不遵守的旧连接池   JavaBean规范,Spring也可以管理它。

答案 2 :(得分:0)

首先,你需要&#34;告诉&#34;弹簧作为参数传递什么。最简单的选项是@Berger在评论中提到的选项。如果由于某种原因这对你来说不是一个好方法(例如,BookRepositorySearch不是一个Spring托管bean),你可以创建一个带有更多逻辑的java配置文件:

@Configuration
public class Config {

   // you can use @Autowired here


   @Bean
   public BookService bookService() {
      return new BookServiceImpl(--pass your parameter here, get it however you want--)
   }

}

修改

显然Spring不再需要@Autowired(感谢@Mark Rotteveel)。 所以问题是春天没有你班级的实例。原因是(我认为)你使用类参数而不是接口。如果您只是创建BookRepositorySearch实现的标记接口并将其用作参数而不是实际的实现,我希望它能够正常工作。 另一个解决方案是我上面已经写过的,但是对于BookRepositorySearch类。

@Configuration
public class Config {

   // you can use @Autowired here


   @Bean
   public BookRepositorySearch bookRepositorySearch () {
      return new BookRepositorySearch();
   }

}

这样Spring就会拥有它心爱的实例;)

答案 3 :(得分:0)

我用此配置解决了它。 在您的 配置文件 中查找@EnableAutoConfiguration

@Configuration

@EnableJpaRepositories(basePackages = "com.akog02.repostories")

@EntityScan(basePackages = "com.akog02.domain")

@EnableTransactionManagement

@EnableAutoConfiguration

public class WebConfiguration {

}