Не верно для метода производителя. Нет причины, по которой метод производителя не может найти задание Quart и затем вернуть тот же экземпляр.

е я интегрировал компоненты Service и DAO в ресурсы REST Джерси, комментируя их@Path следующийУчебник по Java EE

В общем, для работы JAX-RS с корпоративными компонентами необходимо аннотировать класс компонента с помощью @Path, чтобы преобразовать его в класс корневых ресурсов. Вы можете использовать аннотацию @Path с сеансными компонентами без сохранения состояния и одноэлементными компонентами POJO.

Так что мой код был примерно таким:

@Path("/")
public class ServiceResource {
   @Inject
   private AccountService accountService;

   @GET
   @Path("/account/get")
   public Account getAccount(@QueryParam("id") String id) {
     return accountService.get(id);
   }
}

@javax.inject.Singleton
@Path("")
public class AccountService {
   public Account get(String id){...}
}

Теперь я начал интегрировать Quartz Job в свое приложение и хотел найти способ внедрить мойAccountService внутри такой работы

public class AccountJob implements Job {
  @Inject
  private AccountService accountService;

  @Override
  public void execute(JobExecutionContext jec) throws JobExecutionException {
    accountService.updateAllAccounts();
  }
}

я нашел этоответ что говорит использоватьDeltaSpike чтобы сделать работу, поэтому я добавил следующие зависимостиpom.xmlи без добавления каких-либо дополнительных строк кода в любой классaccountService к моемуJob работает отлично

<dependency>
    <groupId>org.apache.deltaspike.modules</groupId>
    <artifactId>deltaspike-scheduler-module-api</artifactId>
    <version>1.7.2</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.apache.deltaspike.modules</groupId>
    <artifactId>deltaspike-scheduler-module-impl</artifactId>
    <version>1.7.2</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.apache.deltaspike.cdictrl</groupId>
    <artifactId>deltaspike-cdictrl-api</artifactId>
    <version>1.7.2</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.apache.deltaspike.cdictrl</groupId>
    <artifactId>deltaspike-cdictrl-weld</artifactId>
    <version>1.7.2</version>
    <scope>runtime</scope>
</dependency>

тем не мениеЯ понял, что когда я удаляю@Path("") отAccountServiceего экземпляр все еще впрыскивается внутриServiceResourceпоэтому мои вопросы следующие:

Зачем добавлятьDeltaSpike зависимости позволили внедрить мои бины без использования@Path на них?Поискав больше, я понял, чтоDeltaSpike внутренне используетWeld сделать инъекцию, и так как я уже используюGlassFish 4.0, Я знаю этоWeld уже есть, так почему инъекция не работает по умолчанию в моемJob класс и вServiceResource класс без добавления@Path на моей фасоли? Собственно зачем добавлять@Path даже предлагается в руководстве по Java?Есть ли плохие побочные эффекты, которые я не вижу в своем коде, потому что я думаю, что я смешиваю несколько методов DI, не понимая, как они работают?

Обновить: После дополнительных поисков я понимаю, чтоJersey не используетWeld для внедрения зависимости, вместо этого он используетHK2другая структура, которая также является частьюGlassFishкогда я пытаюсь ввестиAccountService без использования@Path это показывает следующее исключение

org.glassfish.hk2.api.UnsatisfiedDependencyException: не было объекта, доступного для внедрения в SystemInjecteeImpl (requiredType =AccountService, Родитель =ServiceResource, Отборочные = {} ...

Так что это обновляет вопросы к следующему:

Как сделатьHK2 уколы работает? // Без использования@Path как упоминалось в руководстве по Java EEЕсли бы мне удалось сделатьDI сHK2будет ли безопасно использоватьDeltaSpike сделатьDI для работы кварца? Можно ли смешивать два кадра CDI вместе, чтобы сканировать классы и делать инъекцию?

Я положил свой исходный код на pastebin;pom.xml являетсяВот иJava являетсяВот

Ответы на вопрос(3)

Ваш ответ на вопрос