启动我的应用时遇到问题。有人可以帮我解决这个问题吗?
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;
}
}
答案 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>
{}
使用构造函数进行实例化
当您通过创建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 {
}