2016-11-15 4 views
1

gibt Ich gebe Ihnen die Kurzgeschichte zuerst. Wenn ich in Eclipse meine JAR-Datei mit JAR-Dateien (der Runnable-Jar-Wizard und "Paket benötigte Bibliotheken ...") anstelle von "Extrahiere benötigte Bibliotheken" exportiere, funktioniert alles, aber es ist quälend langsam in Gang zu kommen. Wenn ich mein Glas mit der Extraktionsmethode baue, wird der Code einen eventuellen Fehler verursachen.Mein erster Web-Client, der "MessageBodyWriter nicht für Medientyp gefunden ..." (JSON)

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json 

Ich benutze nicht Maven. Ich weiß es noch nicht. Ich bin größtenteils mit Eclipse größtenteils unerfahren, aber ich komme dorthin. Ich dachte, Genson würde mir geben, was ich brauche, um JSON zu erstellen.

Wenn ich meine JAR-Datei und grep für MessageBodyWriter Liste, ich

1220 Tue Nov 15 10:29:02 CST 2016 javax/ws/rs/ext/MessageBodyWriter.class    
    47 Tue Nov 15 10:29:02 CST 2016 META-INF/services/javax.ws.rs.ext.MessageBodyWriter 

auf die längeren Geschichte zu erhalten, habe ich ein einfaches Java-Projekt in Eclipse, hinzugefügt externe Gläser zu meinem Build-Pfad. Eclipse beschwert sich nicht über etwas fehlt. Es gibt nur eine oder zwei Warnungen über unbenutzte Dies und Das in meinem Code. Der Export funktioniert gut, egal wie ich es mache, keine Probleme. Nur die Ausführung zeigt einige Irritationen.

In meiner Anfrageklasse glaube ich, dass ich alles richtig eingerichtet habe. Dies ist der einfachste vorstellbare POST-Client. Ich habe den erforderlichen leeren Konstruktor, die richtigen Annotationen.

@XmlRootElement 
@Produces(MediaType.APPLICATION_JSON) 

public class QQNotificationRequest { 

    @JsonProperty("id") 
    private int id; 
    @JsonProperty("subId") 
    private int subId; 
    @JsonProperty("type") 
    private int type; 
    @JsonProperty("scode") 
    private int scode; 
    @JsonProperty("datetime") 
    private String datetime; 
    ... 

Dies ist meine letzte Anruf, der

Response resp = m_webTarget.request(MediaType.APPLICATION_JSON).post(Entity.json(message)); 

Das sind meine externe Gläser nicht

javax.ws.rs-api-2.0.1.jar 
aopalliance-repackaged-2.5.0-b05.jar 
hk2-api-2.5.0-b05.jar 
hk2-locator-2.5.0-b05.jar 
hk2-utils-2.5.0-b05.jar 
javassist-3.20.0-GA.jar 
javax.annotation-api-1.2.jar 
javax.inject-2.5.0-b05.jar 
javax.servlet-api-3.0.1.jar 
jaxb-api-2.2.7.jar 
jersey-guava-2.24.jar 
org.osgi.core-4.2.0.jar 
osgi-resource-locator-1.0.1.jar 
persistence-api-1.0.jar 
validation-api-1.1.0.Final.jar 
jersey-client.jar 
jersey-common.jar 
jersey-container-servlet.jar 
jersey-container-servlet-core.jar 
jersey-media-jaxb.jar 
jersey-server.jar 
jargs.jar 
genson-1.4.jar 
jt400.jar 
log4j-api-2.7.jar 
log4j-core-2.7.jar 

Ich fühle mich wie es etwas in das Glas ist, das nicht ‚exportiert‘ werden richtig, aber ich bin mir nicht sicher. Ich rate hier nur, dass Java durch den Prozess der Explosion aller Gläser innerhalb des großen Glases gehen muss, dass es findet, was es benötigt, um die Ausführung zu beginnen, während es bei den .classes innerhalb des großen Glases nicht der Fall ist.

Verloren für den Moment, aber stecken zusammen. Ich schätze alle Hinweise.

Antwort

1

Das Problem besteht darin, dass Dateien im Verzeichnis META-INF/services jedes Jersey Jar, die zur Laufzeit vorhanden sein müssen. Diese Dateien werden zum automatischen Laden und Registrieren von Providerklassen verwendet.

Wenn alle Gläser separat gehalten werden und nur zum Klassenpfad hinzugefügt werden, bleiben alle Dateien intakt. Wenn Sie jedoch ein einzelnes JAR-Objekt erstellen, überschneiden sich diese Dateien (alle haben denselben Namen), sodass nur jeweils eine Datei mit demselben Namen enthalten ist. Also die Datei mit Genson ist wahrscheinlich nicht die eine enthalten.

Sie könnten Genson als Anbieter explizit mit der Anwendung registrieren. Ich benutze Genson nicht wirklich, also bin ich mir nicht sicher, wie ich das richtig machen soll. Aber wenn Sie schnell durch the codebase schauen, sieht es so aus, als müssten Sie die GensonJsonConverter registrieren.

Dies kann funktionieren, aber es löst nicht das Hauptproblem über die Dienste-Dateien, die nicht enthalten sind. Es kann andere automatisch registrierte Komponenten geben, die nicht registriert sind.

Ich bin nicht wirklich ein Eclipse-Benutzer, also bin ich mir nicht sicher, wie Sie dieses Problem beheben können. Ich weiß, dass wenn Sie Maven verwenden, würden Sie die maven-shade-plugin, wie erwähnt here verwenden.Was dieses Plugin tun würde, ist den gesamten Dateiinhalt in eine einzige Datei zu verketten. Dies würde das Problem lösen.

Also ich denke, das ist nur wirklich die halbe Antwort, da ich nicht sicher bin, wie man etwas ähnliches bei der Verwendung von Eclipse tun. Aber zumindest kennen Sie das Problem jetzt.

FYI, this file, ist derjenige, um den Sie hauptsächlich besorgt sind. Wenn Sie durch andere Jersey-Gläser schauen, werden Sie sehen, dass es ähnliche Dateien gibt. Davon rede ich, wenn ich sage, dass nur einer verwendet wird. Sie müssen einen Weg finden, um ihre Inhalte in eine Datei zu verketten, wenn Sie das jar

+0

Als @peekskillet erklärte das Problem ist, dass nur eine dieser Services-Deklarationsdatei exportiert wird - Sie brauchen eine Möglichkeit, sie zusammenzuführen. In Bezug auf Genson können Sie es auch manuell registrieren, überprüfen Sie das Trikot doc [hier] (http://owlike.github.io/genson/Documentation/Extensions/#jax-rs-jersey--cie). – eugen

+0

Ich verstehe die @peekskillet-Antwort noch nicht vollständig und Ihr Link sagt, dass nur das Löschen von Genson in den Klassenpfad automatisches Glück verursacht. :-) Was ich nicht wirklich verstehe, ist, warum das Programm funktioniert, wenn das Glas ein paar Gläser ist, oder ein Glas mit extrahierten Gläsern. Ich werde es noch genauer durcharbeiten. –

+1

Nicht mehr als 2 Minuten, nachdem ich den obigen Kommentar eingegeben habe, habe ich es über die extrahierte Gläser-Methode arbeiten lassen. Ich ging in Build Path-> Configure Build Path und auf der Registerkarte "Order and Export", verschoben Genson-1.4.jar an den Anfang der Liste und exportiert mein Projekt in eine ausführbare jar und getestet. So weit, ist es gut. –

Verwandte Themen