一个servlet请求,可以有两种类型的响应

时间:2015-02-11 22:35:27

标签: java json rest jersey

我的服务器上运行了一个线程(我正在使用Tomcat和Java文件),当用户发出请求时,服务器可以根据线程的状态响应两种类型的响应。响应应该是JSON,我使用Jersey库,Servlet看起来像:

@GET
@Path("init")
@Produces(MediaType.APPLICATION_JSON)
public initResponse respondAsReady() {
    return initRes;
}

这只是一个例子,但问题是我只能使用一种类型的JSON响应(在这种情况下为initResponse)但我需要能够返回另一种类型的响应(比如说initResponse2 })这是一种不同类型的JSON。在其他情况下,我需要使用整数或JSON对象进行响应。那么如何构建我的后端以便它可以处理请求并返回两个可能的响应呢?

2 个答案:

答案 0 :(得分:2)

@GET
@Path("init")
@Produces({MediaType.APPLICATION_JSON , MediaType.TEXT_PLAIN})
public Response respondAsReady() {
    if(/*condition*/)}
        //In case of a JSON response
        return Response.ok(json, MediaType.APPLICATION_JSON).build();
    }
    if(/*condition*/){
        //In case of an integer response
        return Response.ok(text, MediaType.TEXT_PLAIN).build();
    }
}

答案 1 :(得分:1)

您拥有的每个端点都应该有@Consumes注释,此注释定义资源类或MessageBodyReader的方法可以接受的媒体类型,您还需要使用@Produces这定义媒体类型(s)资源类或MessageBodyWriter的方法可以生成

@GET
@Path("init")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public InitResponse respondAsReady() {
    return new InitResponse;
}

@GET
@Path("init")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public String respondAsReady() {
    return new String("5");
}

使用此球衣选择基于请求中的Accept标头的方法,因此请务必将其与您的请求一起发送。阅读此link以了解有关它的更多信息

如果您的客户只接受'text / plain',则将执行第二个端点。只需在Accept标头中超过此值。