2016-04-08 11 views
5

Hallo Studierte Hoffnung jemand in den freien RäumenFrühling Job Launcher nicht in der Lage Dienste zugreifen

Ich habe jsvc Batch-System Quarz Feder füllen kann, die über ein Jahr lang in Betrieb waren. Der Job-Launcher muss eine Verbindung zu 2 Feder-Services herstellen, die erfolgreich in anderen Teilen des Systems ausgeführt werden. Jeder Dienst verfügt über eine Anzahl von SQL-Repositories oder -Diensten. Bitte beachten Sie die Paketdeklarationen. für den Anwendungskontexteintrag.

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(.....)(
     ..... 
    } 
} 

und

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(....){ 
      ..... 
    } 
} 

In meinem Anwendungskontext XML-Datei gibt es die folgende Zeile, die meinen Job Launcher die oben genannten Dienste zu sehen und instanziieren ermöglichen soll. Ich denke, "base-package =" gibt die Pakete an, die nach @ services, @components und @repositories suchen, die injiziert werden können.

<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> 
  1. Ich denke, dass @Component diese Klasse erlauben sollte, die Dienste zu sehen und instaniate sie und alle Abhängigkeiten (sonstige Dienstleistungen) sie haben.
  2. Aus irgendeinem Grund möchte das jsvc-System nur die Klasse unten mit dem Konstruktor NO arg aufrufen. und es injiziert nicht die 2 Dienste.
  3. Meine Komponententests können die Methode, die den Dienst verwendet, nur testen, wenn ich einen 2-Argument-Konstruktor für MOCK-Dienste zur Verfügung stelle. lll

Irgendwelche Gedanken auf, warum Batch-System die Abhängigkeiten nicht injizieren?

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(...) 
    } 
} 
+0

einer meiner Kollegen entdeckte mein Problem –

Antwort

1

Nun, ich fühle mich nicht albern. Das Problem war, dass an dem Punkt, an dem ich davon ausging, dass ich Abhängigkeiten injizieren konnte/würde. Der Anwendungskontext war privat. Sobald ich meinen Anwendungskontext geschützt habe und die Dienste bekommen habe. alle arbeiteten

Verwandte Themen