Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jersey在分析损坏的请求时抛出NullPointerException_Java_Rest_Jersey_Jax Rs - Fatal编程技术网

Java Jersey在分析损坏的请求时抛出NullPointerException

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

当发送内容类型为multipart/mixed但正文已损坏(非multipart)的请求时,Jersey在解析请求时抛出
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-RS
ContainerRequestFilter

自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过滤器,它拒绝没有边界参数的多部分请求。