Транзитивная инъекция фасоли CDI - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть контроллер REST

@Path("/greet")
@RequestScoped
public class GreetController {

    @Inject
    private GreeterService greeterService;

    @GET
    @Path("{name}")
    @Produces(TEXT_PLAIN)
    public String greet(@PathParam("name") String name) {
        return greeterService.greet(name);
    }
}

, который использует GreeterService

@RequestScoped
public class GreeterService {

    @Inject
    private Greeter greeter;

    public String greet(String name) {
        return greeter.greet(name);
    }
}

Сам GreeterService внедряет интерфейс, который имеет две реализации

@RequestScoped
@Hello
public class HelloGreeter implements Greeter {

    @Override
    public String greet(String name) {
        return "Hello " + name;
    }
}

и

@RequestScoped
@Whazzup
public class WhazzupGreeter implements Greeter {

    @Override
    public String greet(String name) {
        return "Whazzup " + name;
    }
}

@Whazzup и @Hello являются просто квалификаторами.

Я пытаюсь внедрить правильную реализацию Greeter -интерфейса в GreeterService на основеКлассификатор, используемый в GreetController.Возможно ли это даже с помощью CDI?Простой обходной путь, конечно, может состоять в том, чтобы иметь два GreeterService с для каждого классификатора, но это кажется плохой идеей, так как число GreeterService с увеличивается при добавлении новых классификаторов.

Конечно, этопросто базовый пример, а GreeterServcie не нужен, но мне не разрешено публиковать код моей компании в StackOverflow, поэтому мне пришлось реализовать простой пример, который воспроизводит нашу архитектуру.

Заранее спасибо!

...