我希望dropwizard将HTTP 500响应作为JSON返回

时间:2015-10-08 19:00:41

标签: dropwizard

我是dropwizard的新手。我使用0.8.5版本的dropwizard。我有一个dropwizard REST服务,当调用成功时返回JSON,当调用不成功时返回HTTL,例如HTTP状态代码为500或404.

快乐的道路

class Base1
{
};


class Der3 : public Base1
{
};


class Base2 : public Base1
{
    public:
    f1();
};


class Der1 : Base2
{
};

class Der2 : Base2
{
};

不愉快的道路

LOGGER.info("Cached userinfo for '{}'",username);
JSONObject json = new JSONObject();
json.put("ticketId",created.getTicketId());
json.put("token", token);
return Response.ok(json.toString()).build();

这是卷曲:

if (created.getTicketId() == null) {
LOGGER.error("Email not sent, ticket not created");
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).type(MediaType.APPLICATION_JSON).build();
}

以下是该卷曲的回复,我想在JSON中回复:

curl -H "Content-Type: application/json" -X POST -d '{"username":"WPf3s0G1M"}' http://localhost:7777/ids-rest-api/password/reset

2 个答案:

答案 0 :(得分:3)

如果向响应中添加实体,即使其是一个空的JSON对象(如此

),您的方法也会有效。
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("/error")
@Produces(MediaType.APPLICATION_JSON)
public class BrokenResource {

    @GET
    public Response getServerError() {
        return Response.serverError().entity("{}").build();
    }
}

如果使用@Produces(MediaType.APPLICATION_JSON)注释方法或类以节省一些时间,则可以显式声明类型。

答案 1 :(得分:2)

我认为投掷WebApplicationException可以正常工作。

应:

import javax.ws.rs.WebApplicationException;

...

throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);

而不是:

Response.status(Response.Status.INTERNAL_SERVER_ERROR)
   .type(MediaType.APPLICATION_JSON).build();

您需要使用@Produces(MediaType.APPLICATION_JSON)注释您的方法或资源类。

然后响应将是JSON格式,如:

{
    "code": 500,
    "message": "HTTP 500 Internal Server Error"
}