Java 如何处理Jersey REST中的空/空请求负载

Java 如何处理Jersey REST中的空/空请求负载,java,rest,jersey,Java,Rest,Jersey,我有一个使用Jersey编写的RESTful web服务,如下所示: @POST @Consumes(MediaType.APPLICATION_JSON) public Response myAction(RequestObject requestObject) { // do some action } 请求对象只是一个简单的DTO: public class RequestObject implements Serializable { private String th

我有一个使用Jersey编写的RESTful web服务,如下所示:

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response myAction(RequestObject requestObject) {
    // do some action
}
请求对象只是一个简单的DTO:

public class RequestObject implements Serializable {
    private String theString;

    // Getter for member
}
当我试图用一个空的请求负载进行POST时,我希望RequestObject要么为null,要么字符串为null。相反,我得到的是:

根本原因java.io.EOFException:由于输入结束,没有要映射到对象的内容 org.codehaus.jackson.map.ObjectMapper.\u initForReading(ObjectMapper.java:2766) org.codehaus.jackson.map.ObjectMapper.\u readValue(ObjectMapper.java:2682) org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1308) org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:419) com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy.readFrom(JacksonProviderProxy.java:139) com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:483) com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123) com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46) com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153) com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker.\u dispatch(AbstractResourceMethodDispatchProvider.java:203) com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302) com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) com.sun.jersey.server.impl.application.WebApplicationImpl.\u handleRequest(WebApplicationImpl.java:1480) com.sun.jersey.server.impl.application.WebApplicationImpl.\u handleRequest(WebApplicationImpl.java:1411) com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1360) com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1350) com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538) com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716) javaservlet.http.HttpServlet.service(HttpServlet.java:803) org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)



当我使用如下所示的请求负载进行post时,我会得到所需的结果(字符串设置为null):

{}
问题:有没有办法接受一个空的请求负载,并在服务器端处理它?

注意:我使用的是POJO support Jersey提供的服务

<servlet>
    <servlet-name>jersey-serlvet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
</servlet>

泽西塞尔维特酒店
com.sun.jersey.spi.container.servlet.ServletContainer
com.sun.jersey.api.json.POJOMappingFeature
真的

尝试实现ContainerRequestFilter,如果负载为空,则中止请求

requestContext.abortWith(Response.status(Response.Status.BAD_REQUEST)
                .entity("Payload is null")
                .build());

可以找到更多详细信息

尝试添加
DefaultValue
注释。如下:
公共响应myAction(@DefaultValue(“{}”)RequestObject RequestObject)
。当你的参数不存在时,它会将一个空的JSON对象注入到你的参数中。我得到了与以前完全相同的结果。在本例中,您可以实现一个servlet过滤器并处理请求,在Jersey收到请求之前填充请求体。
<servlet>
    <servlet-name>jersey-serlvet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
</servlet>
requestContext.abortWith(Response.status(Response.Status.BAD_REQUEST)
                .entity("Payload is null")
                .build());