Maillot jette NullPointerException lors de l'analyse corrompus demande
Lors de l'envoi d'une demande avec un type de contenu multipart/mixed mais corrompus corps (c'est pas multipart), Jersey jette un NullPointerException
lors de l'analyse de la demande.
@POST
@Consumes("multipart/mixed")
public Response someResource(MultiPart multiPart) { ... }
Il en résulte un code de statut de 500, tandis que 4xx serait correct. Comment puis-je gérer cette exception sans prendre toutes les NullPointerExceptions
?
Annexe A: stacktrace:
SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
java.lang.NullPointerException
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.unquoteMediaTypeParameters(MultiPartReaderClientSide.java:227)
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readMultiPart(MultiPartReaderClientSide.java:154)
at com.sun.jersey.multipart.impl.MultiPartReaderServerSide.readMultiPart(MultiPartReaderServerSide.java:80)
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:144)
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:82)
at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:488)
at com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123)
at com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
at com.yammer.metrics.jersey.InstrumentedResourceMethodDispatchProvider$TimedRequestDispatcher.dispatch(InstrumentedResourceMethodDispatchProvider.java:32)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1480)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1411)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1360)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1350)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.togglz.servlet.TogglzFilter.doFilter(TogglzFilter.java:58)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
Pourquoi n'avez-vous pas poster la trace de la pile de vos entrées en phase nationale?
J'ai ajouté la stacktrace
Quelle est la classe ou la méthode
Produit n'a pas d'importance. La méthode n'est jamais dit, parce que les NPE se passe avant dans le cadre de jersey.
J'ai ajouté la stacktrace
Quelle est la classe ou la méthode
@Produces
?Produit n'a pas d'importance. La méthode n'est jamais dit, parce que les NPE se passe avant dans le cadre de jersey.
OriginalL'auteur Francois Bourgeois | 2013-11-19
Vous devez vous connecter pour publier un commentaire.
Ce qui semble être un bug en Jersey. Ils ne vérifient pas la "frontière" valeur de paramètre pour
null
, avant d'être déréférencé. Vous aurez à trouver une solution de contournement jusqu'à ce qu'il est fixe.Solution 1: Fournir un
ExceptionMapper
Peut-être vous pouvez enregistrer un
ExceptionMapper
pourNullPointerException
et inspecter la trace de la pile pour tester, si c'est qu'un bogue ou tout autre NPE. Dans le cas de ce bug, retour4xx
, sinon comme d'habitude500 - internal server error
. (C'est un mauvais hack, mais je pense que c'est ok pour une solution de contournement temporaire).Solution 2: Fournir un JAX-RS
ContainerRequestFilter
Depuis JAX-RS 2.0, il est possible de fournir une
ContainerRequestFilter
qui est appelée avant que la ressource méthode est appelée. Vérifiez le paramètre de limite dans leContent-Type
- tête de la demande. S'il est absent, annuler la demande en appelantContainerRequestContext#abortWith(Reponse)
.Solution 3: Écrire un filtre de servlet
Similaire à la solution 2, mais avec de bons vieux
javax.servlet.Filter
. Assurez-vous que le filtre est appelé avant de Jersey processus de la demande.OriginalL'auteur isnot2bad
Les NPE se produit car le paramètre de limite est manquant dans votre appel. J'ai rencontré le même problème et nécessaires pour résoudre le problème de mon service. J'ai fini d'ajouter manuellement le paramètre de limite à l'entête Content-Type que Jersey est attendu
https://servicesunavailable.wordpress.com/2015/03/04/using-apache-httpclient-4-x-for-multipart-uploads-with-jersey-1-x-server/
Le correctif n'est pas assez puisque la classe MultipartFormEntity est colis privé, cependant, il fonctionne bien.
OriginalL'auteur atomic_ice