Бин OptaPlanner SolverManager не найден в приложении Spring

Я новичок в работе со 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()
}


person kriegsmaschine    schedule 22.04.2020    source источник
comment
Исходный код краткого руководства для этого видео находится здесь: github.com / kiegroup / optaplanner-quickstarts / tree / development /   -  person Geoffrey De Smet    schedule 19.09.2020


Ответы (3)


Чтобы он заработал, вам просто нужно заменить аннотацию @Inject на @Autowire.

В последних версиях Spring рекомендуется использовать инъекцию зависимостей конструктора вместо @Autowire (аннотация больше не требуется, так как Spring автоматически подключает bean-компоненты.

Попробуйте это:

@RestController
@RequestMapping("/api")
public class MainResource {

    // Just the definition here
    private SolverManager<Test, Long> solverManager;

    pubilc MainResource(SolverManager<Test, Long> solverManager) {

     // When Spring will start, the bean will be injected here and become 
     // available in this class
     this.solverManager = solverManager;

    }

    @GetMapping("/test")
    public Test test () {
         // .....
    }

    // Other controller methods .... 

}

Я использую IntelliJ, и он тоже сообщает мне об ошибке. Но я использую тот же код, что и в этом ответе, и он работает.

Как вы заявили, bean-компонент SolverManager настраивается внутри артефакта optaplanner, я подозреваю, что проблема здесь только в неправильной аннотации.

Ошибка IDE меня тоже беспокоит! Но пока это работает, и я оставлю это так. Если я найду решение, то добавлю его сюда.

person funder7    schedule 14.05.2020
comment
У меня такая же проблема в Intellij. У меня не получается запустить приложение. Проблема решилась? Может быть, с optaplanner-spring-boot-starter, optaplanner-spring-boot-autoconfigure? - person slim; 28.06.2020
comment
@slim Если intellij выдает ошибку, возможно, вы можете попробовать скомпилировать с помощью maven / gradle и посмотреть, работает ли без ошибок. Если да, это означает, что Intellij не может распознать, какую реализацию использовать, поэтому, чтобы избежать проблемы, перейдите в Settings > Build, Execution, Deployment > Compiler > Validation, затем на мгновение отключите Spring model и, наконец, выполните сборку заново. Если все работает, вы можете сохранить эту конфигурацию, это просто проблема IDE и не повлияет на скомпилированный вывод! - person funder7; 02.07.2020

Я разрабатываю API REST для оптимизации маршрута с помощью Spring Boot с использованием OptaPlanner. Я только начинаю работать с OptaPlanner, и однажды у меня была такая же проблема. У меня был optaplanner-spring-boot-starter, и я добавил spring-boot-configuration-processor 'с идеей создания конфигурации bean-компонента, которая позволяет безуспешно внедрять SolverManager в мои классы. Также я безуспешно пытался перейти на другие версии OptaPlanner. Наконец, я решил проблему, добавив конфигурацию, которую OptaPlanner включает в свой код, с классом RouteOptimizerConfig. Этот класс создает bean-компонент решателя таким образом, чтобы я уже позже мог его внедрить. Эта проблема, похоже, связана с тем, что в определенный момент OptaPlanner SolverManager перезаписывается.

Попробуйте это и добавьте этот класс в свой проект:

@Configuration
class SolverConfig {

    private final SolverFactory<VehicleRoutingSolution> solverFactory;

    SolverConfig (SolverFactory<VehicleRoutingSolution> solverFactory) {
        this.solverFactory = solverFactory;
    }

    @Bean
    Solver<VehicleRoutingSolution> solver() {
        return solverFactory.buildSolver();
    }
}
person Gloria Leyva    schedule 18.09.2020
comment
Не делайте этого, ненужное и хрупкое. Вместо этого в вашем build.gradle файле добавьте зависимость к optaplanner-spring-boot-starter, как в источники. Тогда вы увидите, что он жалуется, потому что Test не имеет аннотации @PlanningSolution. - person Geoffrey De Smet; 19.09.2020

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

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

person kriegsmaschine    schedule 30.04.2020
comment
Привет, ты в этом уверен? На самом деле я добавил артефакт optaplanner-spring-boot-starter в свой проект весенней загрузки, и даже если моя IDE сообщила, что класс SolverManager не найден для автоматического подключения, после быстрого поиска я обнаружил, что стартовый артефакт зависит от optaplanner-spring-boot-autoconfigure. Если вы заглянете внутрь, там OptaPlannerAutoConfiguration класс, там вы найдете SolverManager Spring Bean. На самом деле я использую диспетчер решателей, и, если не считать ошибки ide, он работает! - person funder7; 14.05.2020
comment
Я забыл ... вы можете найти хорошее вводное видео на этой странице: optaplanner.org/compatibility/ springBoot.html. Кстати, интеграция с Spring не очень хорошо рекламируется, на главной странице есть только небольшая ссылка: / Вам, должно быть, повезло, что вы ее нашли! - person funder7; 14.05.2020
comment
Мы приносим домой руководство по весенней загрузке и пример весенней загрузки для optaplanner 7.38 - и то, и другое будет доступно в документах и ​​кнопках загрузки в виде zip-архива, начиная с 7.38. - person Geoffrey De Smet; 14.05.2020
comment
OptaPlanner поддерживает Spring Boot 100%. Так же, как он поддерживает Quarkus на 100%. Наша совместимость сосредоточена на обоих. - person Geoffrey De Smet; 15.05.2020
comment
Но Quarkus быстрее, а OptaPlanner любит скорость, так как она влияет на качество решения ;-) - person Geoffrey De Smet; 15.05.2020
comment
Привет @GeoffreyDeSmet! Рад встрече! Optaplanner великолепен, я строю вокруг него новый проект. Могу я предложить выделить несовместимость с ним spring-boot-devtools? После недели интенсивных проверок у меня сгорела голова: решатель был инициализирован, но умер до того, как загрузил в него всю информацию о проблеме. Я почти сдавался, но потом прочитал в документации, что инструменты разработчика должны быть отключены. Сработало сразу после их отключения! Я не знаю, возникает ли эта проблема в каждом проекте, но было бы здорово напечатать предупреждение! Спасатель от головной боли! :-) - person funder7; 04.06.2020
comment
Хорошая мысль, я создал здесь jira: issues.redhat.com/browse/PLANNER-2006 - person Geoffrey De Smet; 05.06.2020
comment
Отлично! Есть ли какое-нибудь сообщество, где можно обсудить проект и лучшие практики, или все здесь на stackoverflow? - person funder7; 05.06.2020
comment
@GeoffreyDeSmet, могу ли я использовать optaplanner с проектом Spring mvc - person Med Elgarnaoui; 13.09.2020
comment
да. Но вы можете автоматически вводить SolverManager и т. Д., Если вы тоже используете весеннюю загрузку. Если вы не используете весеннюю загрузку, вам придется вызвать SolverManager.create () самостоятельно. - person Geoffrey De Smet; 14.09.2020