web-dev-qa-db-fra.com

Comment obtenir les journaux de maillot sur le serveur?

J'utilise jersey pour un REST WS. Comment puis-je activer les journaux de jersey côté serveur?

Longue histoire: je reçois une exception côté client - mais je ne vois rien dans les journaux Tomcat [Cela n'atteint même pas ma méthode]. Étant donné que la trace de pile indique "toReturnValue", elle a obtenu quelque chose du serveur. Mais je ne sais pas ce que le serveur a dit.

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)
39
Fakrudeen

Si vous souhaitez activer la journalisation côté serveur, vous devez enregistrer le filtre Jersey LoggingFilter (côté conteneur).

Ce filtre enregistrera les en-têtes et entités de demande/réponse .

Voici ce que vous devez ajouter à votre classe ResourceConfig:

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

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

        register(LoggingFilter.class);    
    }
}

Notez que le même filtre fonctionne également côté client.

Client client = Client.create();
client.addFilter(new LoggingFilter());
59
Brian Clozel

Jersey 2 a déprécié LoggingFilter et vous devez maintenant utiliser LoggingFeature. Pour l'utiliser avec un client, vous pouvez utiliser la snipette suivante:

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

et côté serveur:

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

Jersey 2.0 utilise org.glassfish.jersey.filter.LoggingFilter
Vous pouvez le connecter à l'aide de web.xml

<!-- Register my custom provider (not needed if it's in my.package) AND LoggingFilter. -->
        <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>org.glassfish.jersey.filter.LoggingFilter</param-value>
        </init-param>

Plus d'explications peuvent être trouvées ici

upd:

Après la version 2.23 LoggingFilter est déconseillé et LoggingFeature doit être utilisé. Plus d'informations peuvent être trouvées dans documentation officielle

7
lanwen

Pour Jersey 1.2, ajoutez l'entrée suivante dans web.xml à l'intérieur de la balise servlet:

    <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>
6
eeezyy

Pourriez-vous nous montrer votre code client et nous faire part de la demande également?

Cette exception semble pointer vers l'étape de désarchivage JAXB. Apparemment, vous avez reçu du XML de votre REST API, mais vous n'obtenez pas ce que vous attendez.

Peut-être que le XSD que vous utilisez pour le marshalling/unmarshalling est obsolète ou tout simplement faux.
Vous essayez peut-être d'obtenir la mauvaise entité de la réponse.

Essayez ces étapes et donnez-nous plus de détails sur votre problème:

Obtenez le XML de la réponse

En utilisant un client REST comme Client REST simple (a chrome)), ou votre code:

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);

Validez ce XML avec le XSD que vous utilisez

Ce test devrait échouer (si j'ai raison).

3
Brian Clozel