Java Jersey在分析损坏的请求时抛出NullPointerException
当发送内容类型为multipart/mixed但正文已损坏(非multipart)的请求时,Jersey在解析请求时抛出Java Jersey在分析损坏的请求时抛出NullPointerException,java,rest,jersey,jax-rs,Java,Rest,Jersey,Jax Rs,当发送内容类型为multipart/mixed但正文已损坏(非multipart)的请求时,Jersey在解析请求时抛出NullPointerException @POST @Consumes("multipart/mixed") public Response someResource(MultiPart multiPart) { ... } 这将导致状态代码500,而4xx是正确的。如何处理此异常而不捕获所有NullPointerExceptions 附件A:stacktrace: SEV
NullPointerException
@POST
@Consumes("multipart/mixed")
public Response someResource(MultiPart multiPart) { ... }
这将导致状态代码500,而4xx是正确的。如何处理此异常而不捕获所有NullPointerExceptions
附件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)
。在取消引用之前,它们不会检查null
的“边界”参数值。在修复之前,您必须找到解决方法
解决方案1:提供一个例外情况标签
也许您可以为NullPointerException
注册一个ExceptionMapper
,并检查要测试的堆栈跟踪,如果是该bug或任何其他NPE。如果出现此错误,请返回4xx
,否则像往常一样返回500-内部服务器错误
。(这是一个糟糕的黑客行为,但我认为这对于临时解决方案来说是可以的)
解决方案2:提供JAX-RSContainerRequestFilter
自JAX-RS 2.0以来,可以提供在调用资源方法之前调用的ContainerRequestFilter
。检查内容类型
请求标头中的边界参数。如果没有,请通过调用ContainerRequestContext\abortWith(response)
中止请求
解决方案3:编写servlet过滤器
类似于变通方法2,但使用了良好的旧
javax.servlet.Filter
。请确保在Jersey处理请求之前调用筛选器。由于调用中缺少边界参数,因此会发生NPE。我遇到了同样的问题,需要为我的服务解决这个问题。我最终手动将边界参数添加到Jersey期望的内容类型头中
由于类MultipartFormEntity是包私有的,所以修复程序并不漂亮,但是它工作得很好 为什么不发布NPE的堆栈跟踪?@isnot2bad我添加了StackTrace类或方法
@产生什么?@lutz产生什么并不重要。这个方法永远不会被调用,因为NPE在jersey框架中发生得更早。也许你可以添加一个servlet过滤器,它拒绝没有边界参数的多部分请求。