对返回JSON的Java Jersey RESTful Web服务强制执行HTTP 404错误

时间:2015-07-23 16:30:56

标签: java json web-services rest jersey

我正在使用Jersey 1.19,Java 1.6和Tomcat 5.5.28(即Servlet 2.4)。

代码与此示例类似:

package com.mkyong.rest;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import com.mkyong.Track;

@Path("/json/metallica")
public class JSONService {

    @GET
    @Path("/get")
    @Produces(MediaType.APPLICATION_JSON)
    public Track getTrackInJSON(@Context HttpServletRequest request) {

        if (request.getRequestedSessionId() == null ||
            request.getSession(false) == null) {

            // return to caller with an HTTP 404 error
            // code goes here
        }
        else {

            Track track = new Track();
            track.setTitle("Enter Sandman");
            track.setSinger("Metallica");

            return track;
        }
    }
}

该类返回JSON,这就是调用者所期望的。但是,如果我想执行某些验证,例如错误或不存在的会话并返回HTTP 404错误,那么这是如何完成的?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用HttpServletResponse设置状态代码。

    ...

@Path("/json/metallica")
public class JSONService {
@GET
@Path("/get")
@Produces(MediaType.APPLICATION_JSON)
public Track getTrackInJSON(@Context HttpServletRequest request, HttpServletResponse response) {

    if (request.getRequestedSessionId() == null ||
        request.getSession(false) == null) {
        response.setStatus(404);
        // code goes here
    }
    else {

        Track track = new Track();
        track.setTitle("Enter Sandman");
        track.setSinger("Metallica");

        return track;
    }
}
}

答案 1 :(得分:1)

由于你正在使用JAX-RS,我首选的方法是抛出一个异常并让异常映射器捕获它并返回一个带有所需响应代码的响应。

所以你的资源类是:

@GET
@Path("/get")
@Produces(MediaType.APPLICATION_JSON)
public Track getTrackInJSON(@Context HttpServletRequest request) {

    if (request.getRequestedSessionId() == null ||
        request.getSession(false) == null) {
        throw new IllegalStateException("NOT_FOUND");
    }
}

然后创建一个异常映射器类:

import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class IllegalStateExceptionMapper implements ExceptionMapper<IllegalStateException> {

    @Override
    public Response toResponse(final IllegalStateException exception) {
        if ("NOT_FOUND".equals(exception.getMessage()) {
            return Response.status(Response.Status.NOT_FOUND).build();
        }
    }
}

您可以抛出自己的异常而不是泛型IllegalStateException,但要点是相同的。