Как внедрить класс Singleton, аннотированный @Startup?@Inject, @Resource, @EJB или BeanManager? - PullRequest
0 голосов
/ 24 августа 2018

У меня есть такой класс:

@Singleton
@Startup
@Default
public class A {

    private Manager manager; // Manager is an interface

    @PostConstruct
    public void init() {
      if (some rule is true) {
         manager = new ManagerA();
      } else {
         manager = new ManagerB();
      }
    }

    public Manager getManager() {
       return manager;
    }

}

Теперь у меня есть конечная точка JAX-RS, такая как:

@Path("mypath")
public class B {

    // @Inject vs @Resource vs @EJB - my doubt
    private A objA;

    @POST
    @Path("resource")
    @Consumes("application/json")
    @Produces("application/json")
    public Response myMethod(String param) {

        objA.getMamager().executeSomeMethod(param);

        return Response.status(HttpStatus.SC_OK).build();
    }
}

Когда я ввожу объект, он принимает ошибки независимо от того, какую аннотацию я использую. Некоторые ошибки:

  • WFLYWELD0044: Ошибка при внедрении ресурса в управляемый компонент CDI. не может найти ресурс с именем

  • Не удалось запустить службу. Причина: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Неудовлетворенные зависимости для типа A с квалификаторами @ По умолчанию

Как это решить?

1 Ответ

0 голосов
/ 08 сентября 2018

у вас, вероятно, есть состояние гонки с вашим бином @Singleton @Startup и то, от чего это зависит. Я видел это несколько раз сам. особенно когда bean-компонент @Startup зависит от другого средства, которое должен инициализировать контейнер (например, JPA, JMS, CDI и т. д.). если это так, удалите @Startup и просто дайте инициализировать bean-компоненту, когда он впервые вводится в зависимый объект.

если вам действительно нужно, чтобы bean-компонент был @Startup, попробуйте изолировать, на какой зависимости он отказывает, и пометьте эту зависимость в аннотации @DependsOn (зависимость = "бла-бла-бла").

еще один обходной путь, который я использовал, если вы не можете удалить @Startup, изолировать зависимость и лениво внедрить ее через JNDI (старая школа). иногда все навороты просто мешают «как это на самом деле». / Гринь

caveat emptor

...