如何在Jersey中为有或没有正文

时间:2016-02-12 09:41:51

标签: java post jersey server jax-rs

我有使用Jersey

创建的API

目前,用户可以向其发出POST请求。由于所有信息都在网址中,因此不需要正文。

@POST
@Path("entries")
@Produces(MEDIATYPE_JSON_AND_XML)
public Response createEntry(){
    ...
}

创建一个新的条目,并返回id。 内容 - 请求的类型并不重要,因为没有请求正文数据。

现在还应该可以使用FormData在请求期间设置新条目的特定字段。对于此请求,需要正文,Content-Type必须为multipart/form-data

所以我创建了第二个功能:

@POST
@Path("entries")
@Consumes("multipart/form-data");
@Produces(MEDIATYPE_JSON_AND_XML)
public Response createEntryWithParam(@FormDataParam('param') String param){
    ...
}

第二个功能是在请求中发送参数。但是通过添加它,第一个停止工作。

发送没有Content-Type的请求会抛出NullPointerException。可能是因为@Consumes触发了某种Content-Type - 检查,但失败了。

有没有办法让一个端点接受带或不带请求体的POST请求?

编辑所以,我想在seconds函数中接收所有multipart / form-data请求,并使用第一个作为对该端点的其他POST请求的一个catch-all

1 个答案:

答案 0 :(得分:3)

目前,我有一个解决方案。 如果POST请求没有MediaType(Content-Type)或request-body,我会自动添加一个空的JSON对象并相应地设置Content-Type。

@Provider
public class ContentTypeRequestFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext crc) throws IOException {

        if (crc.getMethod().equals("POST") && crc.getMediaType() == null && crc.getLength() == -1){
            crc.getHeaders().add("content-type", MediaType.APPLICATION_JSON);

            InputStream in = IOUtils.toInputStream("{}");
            crc.setEntityStream(in);
        }
    }
}

这可行,但在我看来有点 hacky 。我很想知道是否有更好的方法来达到我想要的结果。