java loggingfeature - Wie man Jersey-Protokolle am Server erhält?





client (5)


web.xml für Jersey 1.2 den folgenden Eintrag in web.xml innerhalb des Servlet-Tags hinzu:

    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
    </init-param>

Ich benutze Jersey für eine REST WS. Wie aktiviere ich Jersey-Logs auf der Serverseite?

Lange Geschichte: Ich bekomme eine clientside Ausnahme - aber ich sehe nichts in Tomcat Logs [Es erreicht nicht einmal meine Methode]. Da der Stack-Trace "toReturnValue" sagt, hat er etwas vom Server bekommen. Aber ich weiß nicht, was der Server gesagt hat.

Exception in thread "main" java.lang.IllegalArgumentException: source parameter must not be null
 at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:98)
        at com.sun.xml.internal.ws.message.AbstractMessageImpl.readPayloadAsJAXB(AbstractMessageImpl.java:100)
        **at com.sun.xml.internal.ws.client.dispatch.JAXBDispatch.toReturnValue(JAXBDispatch.java:74)**
        at com.sun.xml.internal.ws.client.dispatch.DispatchImpl.doInvoke(DispatchImpl.java:191)
        at com.sun.xml.internal.ws.client.dispatch.DispatchImpl.invoke(DispatchImpl.java:195)



Können Sie uns Ihren Kundencode zeigen und uns auch etwas über die Anfrage erzählen?

Diese Ausnahme scheint auf den JAXB-Unmarshalling-Schritt zu zeigen. Anscheinend haben Sie von Ihrer REST-API etwas XML erhalten, aber Sie bekommen nicht das, worauf Sie warten.

Vielleicht ist die XSD, die Sie zum Marshalling / Unmarshalling verwenden, veraltet oder einfach falsch.
Vielleicht versuchen Sie, die falsche Entität aus der Antwort zu bekommen.

Probieren Sie diese Schritte aus und geben Sie uns weitere Details zu Ihrem Problem:

Holen Sie sich das XML aus der Antwort

Verwenden eines REST-Clients wie Client REST simple (eine Chrome-Erweiterung) oder Ihres Codes:

Builder builder = webResource.path("/yourapi/").accept("application/xml");

// get the client response
ClientResponse response = builder.get(ClientResponse.class);

// log the HTTP Status
logger.log("HTTP Status: " + response.getStatus());

// bypass the jaxb step and get the full response
// MyResource myResource = response.getEntity(MyResource.class);
String myResource = response.getEntity(String.class);
logger.log(myResource);

Validieren Sie diese XML mit der XSD, die Sie verwenden

Dieser Test sollte fehlschlagen (wenn ich recht habe).




Jersey 2 hat LoggingFilter veraltet und Sie müssen jetzt LoggingFeature . Um es mit einem Client zu verwenden, können Sie die folgende Snipette verwenden:

this.client = ClientBuilder
            .newBuilder()
            .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_CLIENT, LoggingFeature.Verbosity.PAYLOAD_ANY)
            .property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_CLIENT, "WARNING")
            .build();

und auf der Serverseite:

ResourceConfig config = new ResourceConfig(HelloWorldResource.class);
config.register(LoggingFeature.class);



Wenn Sie die Protokollierung auf der Serverseite aktivieren möchten, müssen Sie den Filter LoggingFilter Jersey (auf der Containerseite) registrieren.

Dieser Filter protokolliert Header und Entitäten für Anfragen / Antworten .

Folgendes müssen Sie Ihrer ResourceConfig Klasse hinzufügen:

@ApplicationPath("/")
public class MyApplication extends ResourceConfig {

    public MyApplication() {
        // Resources.
        packages(MyResource.class.getPackage().getName());

        register(LoggingFilter.class);    
    }
}

Beachten Sie, dass derselbe Filter auch auf der Client-Seite funktioniert.

Client client = Client.create();
client.addFilter(new LoggingFilter());



Ich habe dieses Beispiel gefunden. Zufallszahlen generieren :

In diesem Beispiel werden zufällige Ganzzahlen in einem bestimmten Bereich generiert.

import java.util.Random;

/** Generate random integers in a certain range. */
public final class RandomRange {

  public static final void main(String... aArgs){
    log("Generating random integers in the range 1..10.");

    int START = 1;
    int END = 10;
    Random random = new Random();
    for (int idx = 1; idx <= 10; ++idx){
      showRandomInteger(START, END, random);
    }

    log("Done.");
  }

  private static void showRandomInteger(int aStart, int aEnd, Random aRandom){
    if ( aStart > aEnd ) {
      throw new IllegalArgumentException("Start cannot exceed End.");
    }
    //get the range, casting to long to avoid overflow problems
    long range = (long)aEnd - (long)aStart + 1;
    // compute a fraction of the range, 0 <= frac < range
    long fraction = (long)(range * aRandom.nextDouble());
    int randomNumber =  (int)(fraction + aStart);    
    log("Generated : " + randomNumber);
  }

  private static void log(String aMessage){
    System.out.println(aMessage);
  }
} 

Ein Beispiellauf dieser Klasse:

Generating random integers in the range 1..10.
Generated : 9
Generated : 3
Generated : 3
Generated : 9
Generated : 4
Generated : 1
Generated : 3
Generated : 9
Generated : 10
Generated : 10
Done.




java jersey