Wie kann eine bestimmte Instanz aus der Anforderung in den benutzerdefinierten Bereich / Kontext (JobScoped - benutzerdefinierter CDI-Bereich) eingefügt werden, um sie injizierbar zu machen?

Saying in a nutshell Ich möchte eine bestimmte Instanz der Konfigurationsklasse aus einer Restanforderung in einen benutzerdefinierten Bereich einfügen. Hauptproblem ist der benutzerdefinierte Bereich (JobScoped von JBerethttps: //jberet.gitbooks.io/jberet-user-guide/content/custom_cdi_scopes/index.htm) ist nach dem Start des Jobs zulässig. Ich weiß, dass es die Möglichkeit gibt, beim Starten des Jobs Eigenschaften hinzuzufügen, aber meine Konfigurationsklasse fasst viele Konfigurationen zusammen, und es ist ziemlich kompliziert, so dass es sehr unangenehm wäre, diese Dateien in die Eigenschaftenklasse zu konvertieren.

Details unten

Dies ist der Pseudocode für die Restanforderung:

@Path("/job")
public class RunJob {

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("/start")
public String startJob(@FormDataParam("file") InputStream uploadedInputStream) {
    JobOperatorImpl jobOperator = (JobOperatorImpl) BatchRuntime.getJobOperator();

    Configuration config = new Configuration(uploadedInputStream);
    Properties properties = new Properties();
    jobOperator.start(job, properties);
}

Was ich erreichen wollte ist, einige Konfigurationsdateien im Kontext von Job wie folgt einzuspritzen:

public class MyReader implements ItemReader {

@Inject
private Configuration configFile;
}

Configuration Klasse präsentiert wie folgt:

@JobScoped
public class Configuration {
 // some flags, methods etc
}

Ich habe über Instance, Provider gelesen, weiß aber nicht, wie ich sie in meinem Fall verwenden soll. Tatsächlich denke ich, dass es unmöglich ist, sie zu verwenden, da die Jobs durch ihren Namen identifiziert werden, der dynamisch ist und zur Laufzeit bekannt ist.

Währenddessen fand ich eine ähnliche Situation wie ich:Kann ich ein Objekt mit Anforderungsbereich erstellen und von überall darauf zugreifen und vermeiden, es in JAX-RS als Parameter weiterzugeben?

Aber dann tritt ein Problem mit fehlendem Kontext auf. Wenn Job gestartet wird, gibt es einen JobScoped-Kontext. Entsprechend der obigen Lösung hatte ich die Konfiguration als RequestScoped kommentiert und erhielt dann:

org.jboss.weld.context.ContextNotActiveException: WELD-001303: Keine aktiven Kontexte für Bereichstyp javax.enterprise.context.RequestScoped at org.jboss.weld.manager.BeanManagerImpl.getContext (BeanManagerImpl.java:689) at org. jboss.weld.bean.ContextualInstanceStrategy $ DefaultContextualInstanceStrategy.getIfExists (ContextualInstanceStrategy.java:90) at org.jboss.weld.bean.ContextualInstanceStrategy $ CachingContextualInstanceStrategy.getIf getIfExists (ContextualInstance.java:63) at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance (ContextBeanInstance.java:83) at org.jboss.weld.bean.proxy.ProxyMethodHandler.getInstance (ProxyMethodHandler.andler) Konfiguration $ Proxy $ _ $ _ WeldClientProxy.toString (Unbekannte Quelle)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage