【问题标题】:How to handle Service unavailable scenarios with Jersey REST如何使用 Jersey REST 处理服务不可用场景
【发布时间】:2015-01-10 07:03:46
【问题描述】:

我有一个与 Spring 集成的球衣 RESTful 服务。web.xml 中映射的基本 url 是 /rest/* 我的服务等级如下:

@Resource
@Scope("request")
@Path("/service/")
@Component
public class ServiceController {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getApiDetails() {
        return Response.ok("area").build();
    }

    @Path("/area")
    @GET
    @Consumes({ MediaType.APPLICATION_JSON })
    @Produces(MediaType.APPLICATION_JSON)
    public Response processConvertCurrency(
        @QueryParam("length") String length,
        @QueryParam("breadth") String breadth) {
        ......
    }
}

点击以下网址时,会显示可用的服务

<baseurl>/rest/service

output : area

&lt;baseurl&gt;/rest/service/area?length=10&amp;breadth20 也将正确返回其输出。

我的要求是,当有人点击&lt;baseurl&gt;/rest/service/volume 时,它应该像这样输出

Service is unavailable message.

由于只有area 可用我该怎么做。请帮助..(当前显示404错误)

【问题讨论】:

标签: java spring rest jersey jax-rs


【解决方案1】:

如果找不到资源,JAX-RS (Jersey) 将抛出 NotFoundException。此异常将映射到包含状态代码 404 Not Found(没有实体主体)的响应,因为这是正常的 REST 行为。但我们也可以通过创建ExceptionMapper 来根据自己的喜好更改响应。在那里我们可以设置一个实体。你可能有类似的东西

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

@Provider
public class NotFoundExceptionMapper
        implements ExceptionMapper<NotFoundException> {
    final String html
            = "<p style='font-size:20px;font-family:Sans-serif'>"
            + "Service is unavailable message."
            + "</p>"
            + "<a href='http://www.stackoverflow.com'>"
            + "Check out Stackoverflow</a>";

    @Override
    public Response toResponse(NotFoundException e) {
        return Response.status(Status.NOT_FOUND)
                .entity(html).build();
    }
}

我们只需要在 Jersey (JAX-RS) 应用程序中注册此提供程序(可能通过ResourceConfig)。

似乎只要我们有一个带有响应的实体主体,我们就会得到

而不是一个


  • See Exception Mapping
  • 注意:您可以通过 web.xml 轻松地将 404 映射到您选择的错误页面,而无需任何 ExceptionMapper。类似的东西

    <error-page>
        <error-code>404</error-code>
        <location>/error.html</location>
    </error-page>
    

    See here for more details


更新

“还有一个疑问,当我设置它时,对于所有 404 相同的消息。我们是否也可以根据请求 url 或其他方式进行自定义。(我的目的是为不同的服务提供不同的消息)”

您可以将不同的上下文注入ExceptionMapper。比如UriInfo,获取请求的路径

@Context
UriInfo uriInfo;

@Override
public Response toResponse(NotFoundException e) {
    String html
        = "<p style='font-size:20px;font-family:Sans-serif'>"
        + "Service is unavailable message."
        + "</p>"
        + "<a href='http://www.stackoverflow.com'>"
        + "Check out Stackoverflow</a>";
    html += "<p>Requested URI: " + uriInfo.getAbsolutePath() + "</p>";
    return Response.status(Status.NOT_FOUND)
            .entity(html).build();
}

还有其他可以注入的上下文。它们是否可以注入到类中取决于类(资源类/提供者类)及其应用范围(除其他外)。但这里有一个可注入上下文的列表(带有 @Context 注释)。

  • javax.ws.rs.core.HttpHeaders
  • javax.ws.rs.core.UriInfo
  • javax.ws.rs.core.Request
  • javax.servlet.HttpServletRequest
  • javax.servlet.HttpServletResponse
  • javax.servlet.ServletConfig
  • javax.servlet.ServletContext
  • javax.ws.rs.core.SecurityContext
  • 可能更多:-)

【讨论】:

  • 谢谢它(ExceptionMapper)的作品。还有一个疑问,当我设置它时,对于所有 404 相同的消息。我们是否也可以根据请求 url 或其他方式进行自定义。(我的目的是为不同的服务提供不同的消息)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
相关资源
最近更新 更多