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

标签 java rest jersey

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

@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 为空,或者 theString 为空。相反,我得到这个:

根本原因

java.io.EOFException: No content to map to Object due to end of input
    org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2766)
    org.codehaus.jackson.map.ObjectMapper._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._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._handleRequest(WebApplicationImpl.java:1480)
    com.sun.jersey.server.impl.application.WebApplicationImpl._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)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)



When I post with a request payload that looks like this I get the desired result (theString is set to null).:

{}


QUESTION: Is there a way to accept an empty request payload, and handle it on the server side?

Note: I'm using the POJO support Jersey offers.

<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>

最佳答案

尝试实现 ContainerRequestFilter 并在负载为空时中止请求。

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

可以找到更多详细信息here

关于java - 如何处理 Jersey REST 中的空/空请求负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13326142/

相关文章:

java - 与 Jersey 错误处理达成协议(protocol)

node.js - 如何在nodejs中的端点调用中传递变量

java - REST Jackson JsonDeserialize,升级后出现 StackOverflowError

java - ivy冲突解决失败?

java - 重新验证用户。使用适用于 Android 的 FirebaseUI 身份验证

rest - 如何将工作项作为子项添加到父项?

java - 用于网络错误处理的 Jersey API

java - 使用 Java 中的 Supply<InputStream> 流给出 Jersey 响应

java - 更改 Vaadin 流程 (14) 基本配置不影响

java - 检查结果是否是一个好的 playframework