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)
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());
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);
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
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>
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:
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);
Ce test devrait échouer (si j'ai raison).