在Spring应用中找不到OptaPlanner SolverManager Bean。

问题描述 投票:0回答:2

我是一个使用Spring的新手,我遇到了一个似乎无法解决的问题。 我正在尝试使用一个名为 光谱仪. 在这种情况下,我或多或少地跟着一个简单的课程安排视频是。此处 而我正在处理的部分发生在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来管理我的opaplanner包,我可以看到依赖关系是存在的(它是一个叫做SolverManager的接口)。 我想不通为什么它不能找到生成bean的方法。 我假设Spring会在飞行中生成bean,就像JPA仓库的bean在使用@Autowired装饰器时被创建一样。 我试着将SolverManager代码复制并粘贴到我的项目根目录下的自己的文件中,并尝试了一些装饰器(例如@Component),希望Spring能够检测到它,但它仍然抛出同样的错误,我不知道该怎么办。

我在GitHub上创建了一个非常简单的演示应用。此处 有错误的文件。 该错误在文件 srcmainjavacomjavaoptaplexresourceMainResource.java。

此外,在IntelliJ中,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()
}

java spring-boot dependency-injection optaplanner sprint
2个回答
1
投票

要使它工作,你只需要替换掉你的 @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,它也向我报告了这个错误。但我使用的是我在这个答案中发布的相同的代码,它也能正常工作。

正如你所说的那样 SolverManager bean是在opaplanner artifact里面配置的,我怀疑这里的问题只是使用了错误的注解。

IDE的错误也困扰着我。但目前它还能正常工作,所以我将保持这样的状态。如果我找到了解决方法,那么我会在这里添加。


-1
投票

原来,经过网上大量的搜索和翻阅Optaplanner的Spring Boot包,SolverManager bean并没有为Spring提供。 看来开发的重点是Quarkus框架。

我想这是一个尝试Quarkus的好机会,一旦我做了改变,我的代码就可以工作了。 在Youtube上有一些很好的视频,是由首席开发者Geoffrey De Smet拍摄的关于通过Quarkus设置Optaplanner的。

© www.soinside.com 2019 - 2024. All rights reserved.