2016-06-07 11 views
3

Arbeits Im Anschluss an this SO thread, meine Frage ist, ob ich etwas grundlegend falsch hier so mache:Jersey Konstruktor Injektion mit @Context nicht

Glassfish Mit 4.1, Ich versuche, ein MessageBodyReader zu schreiben, die einen Konstruktor hat wie dies:

package com.acme; 

import javax.ws.rs.core.Context; 
import javax.ws.rs.ext.Provider; 
import javax.ws.rs.ext.Providers; 
import javax.ws.rs.Consumes; 

@Provider 
@Consumes("application/xml") 
public class MyMessageBodyReader implements MessageBodyReader<Object> { 
    public MyMessageBodyReader(@Context Providers ps) { 
     // try to do something with ps here 
     // e.g. pass to a superclass constructor, 
     // as required by the solution in the other thread 
    } 

    [...] // implemented interface methods 
} 

Aber was auch immer ich tun wRT Konfiguration umgibt, habe ich immer eine Folge von diesen Ausnahmen:

2016-06-07T17:19:28.484+0200|WARN: The following warnings have been detected: WARNING: Unknown HK2 failure detected: 
MultiException stack 1 of 1 
org.jboss.weld.exceptions.CreationException: WELD-001530: Cannot produce an instance of class com.acme.MyMessageBodyReader. 
    at org.jboss.weld.injection.producer.NonProducibleInjectionTarget.produce(NonProducibleInjectionTarget.java:55) 
    at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory$2.getInstance(CdiComponentProvider.java:242) 
    at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory.provide(CdiComponentProvider.java:189) 
    [...] 

gefolgt von

WARNING: Unknown HK2 failure detected: 
MultiException stack 1 of 2 
org.jboss.weld.exceptions.CreationException: WELD-001530: Cannot produce an instance of class com.acme.MyMessageBodyReader. 
    at org.jboss.weld.injection.producer.NonProducibleInjectionTarget.produce(NonProducibleInjectionTarget.java:55) 
    at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory$2.getInstance(CdiComponentProvider.java:242) 
    at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory.provide(CdiComponentProvider.java:189) 
    [...] 
MultiException stack 2 of 2 
java.lang.IllegalStateException: Unable to perform operation: create on org.glassfish.jersey.message.internal.MessageBodyFactory 
    at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:389) 
    at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:461) 
    at org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:114) 
    [...] 

ich einige Beispiele für die Injektion Providers in einen Konstruktor gefunden habe, nicht zuletzt in den Unterklassen von XmlRootElementJaxbProvider, die mit Glassfish 4.1 Schiff - nach allem, ich will sowieso ihre Klassenhierarchie wieder zu verwenden, wie Es ist im verknüpften Thread gemacht.

Vielen Dank im Voraus für eine Beratung.

+0

Ist das noch die modifizierte MessageBodyFactory verwenden Sie in Ihren anderen Thread beschrieben? Wenn Sie die Hauptklassen in Jersey gehackt und neu aufgebaut haben und Fehler erhalten, die darauf hindeuten, dass die Klasse nicht bereitgestellt werden kann - diese beiden Dinge sind wahrscheinlich miteinander verknüpft. Plus Ihr Code hat jetzt keine Portabilität ... – BadZen

+0

Hinweis, ich bin nicht der Autor in dem anderen Thread. Ich habe die MessageBodyFactory (noch) nicht modifiziert, wie es das OP getan hat, wie ich zuerst sehen wollte, wenn ich einen angepassten MessageBodyReader/Writer überhaupt bekommen und laufen lassen könnte. –

Antwort

2

Ich kann die Ursache der Ausnahme nicht erklären, aber ich stieß auf das gleiche Problem und zu der Zeit fühlte ich mich nicht mehr in die Jersey-Quelle vertiefen, als ich bereits hatte.

Ich landete faul meine benutzerdefinierte MessageBodyReader/Writers geladen, so dass ich Providers in den Wrapper injizieren konnte. Es ist nicht schön, aber es funktioniert.

Etwas entlang der Linien von:

@Provider 
@Consumes("application/xml") 
public class MyLazyMessageBodyReader implements MessageBodyReader<Object> { 
    @Context 
    private Providers ps; 

    private MessageBodyReader<Object> reader; 

    @Override 
    public final Object readFrom(
      Class<Object> type, 
      Type type1, 
      Annotation[] antns, 
      MediaType mt, 
      MultivaluedMap<String, String> mm, 
      InputStream in) 
      throws IOException, WebApplicationException 
    { 
    return this.getLazyReader().readFrom(type, type1, antns, mt, mm, in); 
    } 

    private MessageBodyReader<Object> getLazyReader() { 
    if (this.reader == null) { 
     this.reader = new MyMessageBodyReader(this.ps); 
    } 
    return this.reader; 
    } 
} 

public class MyMessageBodyReader implements MessageBodyReader<Object> { 
    public MyMessageBodyReader(Providers ps) { 
     // try to do something with ps here 
     // e.g. pass to a superclass constructor, 
     // as required by the solution in the other thread 
    } 

    [...] // implemented interface methods 
}