@RestController
及其设置工作良好。当我试图将服务添加到控制器并自动连接它们时,我遇到了一个障碍。
据我所知,一切看起来都很好:它构建得很好,IDE无法检测到任何问题。但是我好像少了点什么,因为它跑不动了。
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of constructor in org.church.id.controller.ChapterController required a bean of type 'org.church.id.service.ChapterService' that could not be found.
Action:
Consider defining a bean of type 'org.church.id.service.ChapterService' in your configuration.
ChapterController.java
@RestController
@Log4j
public class ChapterController {
@Getter
private Map<Integer, Chapter> chapters;
private ChapterService chapterService;
@Autowired
public ChapterController(ChapterService chapterService) {
this.chapterService = chapterService;
}
public void loadChapters() throws SQLException {
log.debug("Loading chapters...");
if (chapters != null) {
chapters.clear();
}
chapters = chapterService.findAll().stream().collect(Collectors.toMap(Chapter::getId, Function.identity()));
}
@GetMapping("/chapter/list")
public String list() throws SQLException {
if (chapters == null) {
loadChapters();
}
return chapters.values().stream().map(Chapter::getName).collect(Collectors.joining(", "));
}
}
在我的applicationContext.xml(我的错。我最初输入的是pom.xml)
...
<bean id="chapterController" class="org.church.id.controller.ChapterController">
<constructor-arg name="chapterService" ref="chapterService"/>
</bean>
<bean id="chapterService" class="org.church.id.service.impl.ChapterServiceImpl">
<constructor-arg name="config" ref="dbConfig"/>
<constructor-arg name="addressUtil" ref="addressUtil"/>
</bean>
...
真正的pom.xml
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
<scope>test</scope>
</dependency>
...
ChapterServiceImpl.java
@Log4j
@AllArgsConstructor
@Setter
@Service
public class ChapterServiceImpl implements ChapterService {
private DBConfig config;
private AddressUtil addressUtil;
...
}
ChapterService.java(接口)
public interface ChapterService extends Service<Chapter> {
Collection<Chapter> findByCountry(Country country) throws SQLException;
}
我在这里找了一下,但以下这些方法对我都有效
- [x]添加
(exclude = {DataSourceAutoConfiguration.class})
到@SpringBootApplication
- [x]将
@Qualifier("chapterService")
添加到构造函数的参数前:ChapterService chapterService
还要注意:我已经将其修改为只有一个默认构造函数,但是当我试图通过setter注入时,会发生相同类型的错误。我不知道怎么了。(
编辑:MainClassController.java
@SpringBootApplication
public class MainClassController {
private ClassInfo model;
private HashMap<Integer, String> classMap;
public MainClassController() {
loadData();
}
public void loadData() {
}
public static void main(String[] args) {
SpringApplication.run(MainClassController.class, args);
}
}
小背景:我几年前开始了我的项目,但后来偏离了方向,现在又重新开始了。
对我来说有效的是从一个基本的spring-boot项目开始,然后添加我的类并在我进行的过程中进行修复。
正如@ jo
@AbhijitSarkar还建议"没有人再使用Spring XML配置了";这实际上是我开始这个项目时的一种反思。他也很有洞察力,能够看出我的问题是由互联网搜索组合引起的。