为 Java Jersey RESTful Web 服务强制 HTTP 404 错误 returns JSON
Force a HTTP 404 error for a Java Jersey RESTful web service that returns JSON
我正在使用 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;
}
}
}
class returns JSON 这就是调用者所期望的。但是,如果我想执行一些验证,例如错误或不存在的会话,并且 return HTTP 404 错误,这是如何完成的?
感谢您的帮助。
您可以使用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;
}
}
}
由于您使用的是 JAX-RS,我的首选方法是抛出异常并让异常映射器捕获它,然后 return 包含所需响应代码的响应。
因此您的资源 class 将是:
@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");
}
}
然后创建异常映射器class:
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,但要点是一样的。
我正在使用 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;
}
}
}
class returns JSON 这就是调用者所期望的。但是,如果我想执行一些验证,例如错误或不存在的会话,并且 return HTTP 404 错误,这是如何完成的?
感谢您的帮助。
您可以使用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;
}
}
}
由于您使用的是 JAX-RS,我的首选方法是抛出异常并让异常映射器捕获它,然后 return 包含所需响应代码的响应。
因此您的资源 class 将是:
@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");
}
}
然后创建异常映射器class:
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,但要点是一样的。