Spring作业启动器无法访问服务

标签 spring spring-batch

嗨 还在学习希望有人能填补空白

我有运行一年多的 JSVC quartz Spring 批处理系统。 Job 启动器需要连接 2 个在系统其他部分成功运行的 spring 服务。每个服务都有许多注入(inject)到其中的 sql 存储库或服务。
请注意包装声明。用于应用程序上下文条目。

package com.mycompany.business.services.impl;
....
@Service
public class BatchProcessService {
   private final DomainSepcificRepository1 rep1;
   ...
   private final DomainSepcificRepositoryN repN;

   @Inject
   public BatchProcessService(Final final DomainSepcificRepository1 rep1,..., final DomainSepcificRepositoryN repN) {
   // injected values assigned to instance variables.
   }
   public List <...> findByCriteria(.....)(
      .....
   }
}


package com.mycompany.business.services.impl;
 ....
 @Service
 public class EmailNotificationServiceImpl implements EmailNotificationService {

     private UserService userService;

     private final MailMessage mailMessage;

     private final MailTransport mailTransport;

     @Inject
     public EmailNotificationServiceImpl(final UserService userService, final MailMessage mailMessage, final MailTransport mailTransport) {
        this.userService = userService;
        this.mailMessage = mailMessage;
        this.mailTransport = mailTransport;
     }
     .....
     public void notifySupportStaff(....){
          .....
    }
}

在我的应用程序上下文 xml 文件中,有以下行应该允许我的作业启动器查看和实例化上述服务。我认为“base-package=”指定要查找可以注入(inject)的@services、@components 和@repositories 的包。
 <context:component-scan base-package="com.mycompany.common.batch, com.mycompany.batch, com.mycompany.business.services" >
    <context:exclude-filter type="assignable" expression="com.mycompany.common.batch.scheduler.service.MyCompanySchedulerService"/>
 </context:component-scan>  
  • 我认为@Component 应该允许此类查看服务并实例化它们以及它们拥有的任何依赖项(其他服务)。
  • 出于某种原因,jsvc 系统只想使用 NO arg 构造函数调用下面的类。并且它没有注入(inject)这 2 项服务。
  • 仅当我为 MOCK 服务提供 2 参数构造函数时,我的单元测试才能使用该服务测试该方法。
    lll

  • 关于为什么批处理系统无法注入(inject)依赖项的任何想法?
    package com.mycompany.batch.scheduler;
     ....
     @Inject
     private BatchProcessService batchProcessService;
     @Inject
     private EmailNotificationService emailNotificationService;
     @Component
     public class MyCompanySchedulerJobLauncher extends SchedulerJobLauncher {
    
     public MyCompanySchedulerJobLauncher() {
        super();
    }
    
    // @Inject
    public MyCompanySchedulerJobLauncher(final BatchProcessService batchProcessService, final EmailNotificationService emailNotificationService) {
        super();
        this.batchProcessService = batchProcessService;
        this.emailNotificationService = emailNotificationService;
    }
    
    @Override
    public int processJob(final JobExecutionContext context) throws JobRestartException, JobExecutionAlreadyRunningException, ParseException {
    ......
        if(batchProcessSerive.findByCriteria(....).size() == 0) {
            emailNotificationService.notifySupport(...)
         }
    }
    

    最佳答案

    好吧,我不觉得自己很傻。
    问题在于,在我假设我可以/将注入(inject)依赖项的时候。应用程序上下文是私有(private)的。一旦我使我的应用程序上下文受到保护并获得服务。一切正常

    关于Spring作业启动器无法访问服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36502209/

    相关文章:

    java - 在正文异常 spring rest 中添加新字段

    java - 在http get请求中设置对象

    java - Angular POST JSON 请求返回 417 期望失败

    java - 如何在 AbstractTransactionalJUnit4SpringContextTests 测试中测试我的 DAO 更新方法?

    spring-boot - Spring Batch 5 不会自动启 Action 业

    spring - jersey-spring3 实例化 Spring 管理的 bean (null!)

    java - Spring Boot启动时调用的Tasklet执行方法

    java - Spring Batch CommandLineJobRunner 在由企业调度程序运行时挂起

    java - spring-batch 读取 null int 值

    java - 如何为自定义 Spring Batch Reader 编写 junit