Не верно для метода производителя. Нет причины, по которой метод производителя не может найти задание 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
являетсяВот