2016-04-08 23 views
5

Hi imparare ancora la speranza che qualcuno possa riempire gli spazi vuotiPrimavera lavoro programma di avvio non in grado di accedere ai servizi

ho sistema discontinuo primavera quarzo jsvc che è stato in esecuzione per più di un anno. Il lanciatore di lavoro deve connettersi a 2 servizi primaverili che vengono eseguiti correttamente in altre parti del sistema. Ogni servizio ha un numero di repository o servizi sql immessi in esso. Si prega di prendere nota delle dichiarazioni del pacchetto. per la voce del contesto dell'applicazione.

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

e

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

Nel mio file dell'applicazione contesto xml, c'è la seguente riga che dovrebbe consentire il mio lavoro di avvio per vedere e istanziare i servizi di cui sopra. Penso che "base-pacchetto =" specifichi i pacchetti da cercare per @services, @components e @repositories che possono essere iniettati.

<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. penso che @Component dovrebbe consentire questa classe per vedere i servizi e li ed eventuali dipendenze (altri servizi) che hanno instaniate.
  2. Per qualche motivo il sistema jsvc desidera solo richiamare la classe seguente con il costruttore NO arg. e non sta iniettando i 2 servizi.
  3. I miei test di unità sono in grado di testare il metodo utilizzando il servizio solo se fornisco un costruttore di argomenti a 2 argomenti per i servizi MOCK. lll

Dei pensieri su perché il sistema batch non può iniettare le dipendenze?

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

uno dei miei colleghi ha individuato il mio problema –

risposta

1

Beh, non mi sento stupido. Il problema era che nel punto in cui stavo assumendo che avrei/avrei iniettato dipendenze. Il contesto dell'applicazione era privato. Una volta ho reso protetto il mio contesto applicativo e ottenuto i servizi. tutto funzionava