Я новичок в работе со Spring и столкнулся с проблемой, которую не могу решить. Я пытаюсь работать с пакетом под названием Optaplanner. В этом случае я более или менее слежу за простым планировщиком курса, видео находится здесь. и часть, над которой я работаю, происходит в 51:00.
Моя проблема в том, что на одном этапе процесса требуется внедрение зависимости, и когда я создаю / запускаю приложение Spring, я получаю следующую ошибку:
Description:
Field solverManager in com.java.optaplex.resource.MainResource required a bean of type 'org.optaplanner.core.api.solver.SolverManager' that could not be found.
The injection point has the following annotations:
- @javax.inject.Inject()
Action:
Consider defining a bean of type 'org.optaplanner.core.api.solver.SolverManager' in your configuration.
Process finished with exit code 1
Я использовал Gradle для управления своим пакетом optaplanner и вижу, что зависимость присутствует (это интерфейс под названием SolverManager). Однако я не могу понять, почему он не может найти / сгенерировать bean. Я предполагаю, что Spring будет генерировать bean-компонент на лету так же, как bean-компонент репозитория JPA создается при использовании декоратора @Autowired. Я попытался скопировать и вставить код SolverManager в свой собственный файл в корне моего проекта и попробовал использовать несколько декораторов (например, @Component) в надежде, что Spring обнаружит его, но он по-прежнему выдает ту же ошибку, и я не уверен, что делать.
Я создал очень простое демонстрационное приложение на GitHub, здесь, в котором есть ошибка. Ошибка находится в файле src / main / java / com / java / optaplex / resource / MainResource.java.
Кроме того, в IntelliJ экземпляр SolverManager solverManager (см. Код ниже) выделен и говорит:
Could not autowire. No beans of 'SolverManager<Test, Long>' type found.
MainResource.java:
package com.java.optaplex.resource;
import com.java.optaplex.pojo.Test;
import org.optaplanner.core.api.solver.SolverManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.inject.Inject;
@RestController
@RequestMapping("/api")
public class MainResource {
// THE OFFENDING LINE IS HERE
@Inject
SolverManager<Test, Long> solverManager;
@GetMapping("/test")
public Test test () {
return new Test("Result message here");
}
}
Для ясности мой тестовый класс в объявлении менеджера решателя:
Test.java
package com.java.optaplex.pojo;
public class Test {
private String message;
public Test(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Я понимаю, что мой примерный код на самом деле не использует SolverManager, я просто хочу, чтобы ошибка при сборке прекратилась, чтобы я мог продолжить разработку. Я просто хотел представить очень простой случай, который вызвал ошибку.
Наконец, мои зависимости Gradle выглядят так:
build.gradle:
plugins {
id 'org.springframework.boot' version '2.2.6.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
id 'war'
}
group = 'com.java'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
// https://mvnrepository.com/artifact/org.optaplanner/optaplanner-core
compile group: 'org.optaplanner', name: 'optaplanner-core', version: '7.36.1.Final'
compile group: 'javax.inject', name: 'javax.inject', version: '1'
}
test {
useJUnitPlatform()
}