Как внедрить зависимость Gradle в приложение Spring, если в пакете не найден компонент? - PullRequest
0 голосов
/ 22 апреля 2020

Я довольно новичок в работе со 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). Однако я не могу понять, почему он не может найти / сгенерировать компонент. Я предполагаю, что Spring будет генерировать bean-компонент на лету так же, как создается bean-компонент репозитория JPA при использовании декоратора @Autowired. Я попытался скопировать и вставить код SolverManager в его собственный файл под моим проектом root и пробовал несколько декораторов на нем (например, @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 в объявлении менеджера Solver:

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()
}

1 Ответ

0 голосов
/ 30 апреля 2020

Оказывается, после большого количества онлайн-поиска и поиска в пакетах Optaplanner Spring Boot компонент SolverManager для Spring не предоставляется. Похоже, что разработка сосредоточена на инфраструктуре Quarkus.

Я подумал, что это хороший шанс опробовать Quarkus, и как только я внес изменение, мой код заработал. На Youtube есть несколько хороших видео от ведущего разработчика Джеффри Де Смета о настройке Optaplanner через Quarkus.

...