Java/ quarkus :如何注入返回相同数据类型的不同示例

xj3cbfub  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(142)

我在一个有点棘手的情况下,我有2个方法在我的Quarkus RESTApplication都返回相同的数据类型。但是,我想注入到2个不同的变量。
如果只有一个方法有一个变量,那么一切正常,但由于有2个方法,两者返回相同的类型,Quarkus无法识别哪个注入,并运行到错误:

Ambiguous dependencies for type String and qualifiers [@Default]

下面是我的代码:RestApplication.class,它具有将提供所需依赖项的@Produces:

@ApplicationPath("/")
public class RESTApplication extends Application {

    @Produces
    public String firstMethod() {
        System.out.println("firstMethod : returns Hello One");
        return "HELLO ONE";
    }

    @Produces
    public String secondMethod() {
        System.out.println("secondMethod : returns Hello TWO");
        return "HELLO TWO";
    }
}

下面是我要注入返回值的类:

@Path("/api")
public class RestAPI {

    @Inject
    String one;

    @Inject
    String two;

    @Path("/one")
    @POST
    @Consumes(MediaType.TEXT_PLAIN)
    @Produces(MediaType.TEXT_PLAIN)
    public String myMethodOne(final String input) {
        System.out.println("One : " + one)
        return one;
    }

    @Path("/two")
    @POST
    @Consumes(MediaType.TEXT_PLAIN)
    @Produces(MediaType.TEXT_PLAIN)
    public String myMethodOne(final String input) {
        System.out.println("Two : " + two)
        return two;
    }
}

正如你所看到的,两个方法返回相同的类型,所以Quarkus无法理解注入哪一个。有办法区分这一点吗?
如果我删除RestApplication中的第二个方法,那么一切都可以完美地工作。在我的项目中,我需要根据一些计算返回相同类型的不同值,所以我需要使用类似下面的方法。

rta7y2nd

rta7y2nd1#

基于OP的代码,不要过长。
java :

@Qualifier // Create Qualifier annotation
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface Blah {}

...

@Produces
@Blah // Add it
public String firstMethod() {

...

@Inject
@Blah // Qualify it
String one;

Kotlin:

@Qualifier // Create Qualifier annotation
@Retention
@Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION, AnnotationTarget.FIELD, AnnotationTarget.CLASS, AnnotationTarget.VALUE_PARAMETER) // Not all are needed
annotation class Blah

...

@Produces
@Blah // Add it
fun firstMethod(): String {

...

// As a constructor parameter
class RestAPI(@Blah private val one: String) {

// OR as a field
@Inject
@field:Blah
lateinit var one: String

相关问题