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>
- Ich denke, dass @Component diese Klasse erlauben sollte, die Dienste zu sehen und instaniate sie und alle Abhängigkeiten (sonstige Dienstleistungen) sie haben.
- 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.
- 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(...)
}
}
einer meiner Kollegen entdeckte mein Problem –