如何使用 Jersey REST 处理服务不可用的情况

2024-03-20

我有一个与 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

Also <baseurl>/rest/service/area?length=10&breadth20将正确返回其输出。

我的要求是当有人打<baseurl>/rest/service/volume它应该输出像

Service is unavailable message.

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


JAX-RS(泽西岛)将抛出一个NotFoundException如果找不到资源。此异常将映射到包含状态代码 404 Not Found(没有实体正文)的响应,因为这是正常的 REST 行为。但我们也可以根据自己的喜好更改响应,方法是创建一个ExceptionMapper https://jersey.java.net/apidocs/2.7/jersey/javax/ws/rs/ext/ExceptionMapper.html。在那里我们可以设置一个实体主体。你可能有类似的东西

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).

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

代替


  • 请参阅异常映射 https://jersey.java.net/documentation/latest/representations.html#d0e5207
  • 注意:您可以通过 web.xml 轻松地将 404 映射到您选择的错误页面,而不需要任何 ExceptionMapper。就像是

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

    请参阅此处了解更多详情 https://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/web_xml.html#1017571


UPDATE

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

您可以将不同的上下文注入到ExceptionMapper。例如UriInfo https://docs.oracle.com/javaee/7/api/javax/ws/rs/core/UriInfo.html,并获取请求的路径

@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
  • 可能更多:-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Jersey REST 处理服务不可用的情况 的相关文章

  • 从SQLite列中获取所有数字字符串并进行总和计算

    我是 Android 和 SQLite 的新手 我在 SQLite 中有一个只有数字的 AMOUNT 列 我可以在 ListView 中显示它 但我无法找到任何我理解的方法来将它们全部添加并显示在 TextView 中 这是数据库助手 im
  • Java 7u51/7u55 带星号的清单变量

    我正在部署一个小程序 其中包含清单中的下一个变量 Manifest Version 2 0 Ant Version Apache Ant 1 8 2 Trusted Library true Permissions all permissi
  • Eclipse 与 IntelliJ 热部署

    我的应用程序配置 Tomcat 8 Spring Spring MVC Hibernate 在 Eclipse 中 我创建了 Tomcat 服务器 并将我的应用程序添加到资源中 JSP JS CSS 和 JAVA 类热部署的工作原理就是这样
  • Java中如何对对象数组进行排序?

    我的数组不包含任何字符串 但它包含对象引用 每个对象引用都通过 toString 方法返回名称 id 作者和发布者 public String toString return name n id n author n publisher n
  • 如何访问EmbeddedSolrServer实例的管理界面?

    在我的网络应用程序中 我正在运行org apache solr client solrj embedded EmbeddedSolrServer出于调试目的 我想访问管理界面 这就是我实例化服务器的方式 new EmbeddedSolrSe
  • JSF-2 应用程序中的服务器端计时器

    在我正在开发的 JSF 2 应用程序中 当用户执行操作时 我需要启动服务器端计时器 这个计时器必须与应用程序本身相关 因此它必须在用户会话关闭时继续存在 为了解决这个问题 我想使用 java util Timer 类在应用程序范围的 bea
  • Android Studio:如果设置项目的背景颜色,ListView OnClick 动画将不起作用

    在我的项目中 我在 ListView 内设置了项目 由插入 ConstraintLayout 中的多个元素组成 的背景颜色 但如果背景颜色不是至少一点透明 则单击和长按的默认动画会消失 事实上 随着透明度的降低 点击元素的效果越来越不明显
  • 从 Java 应用程序读取的文件是否会调用系统调用?

    我的理解是 请求文件系统路径 例如 aFile 的用户应用程序将调用文件系统并获取所请求文件的虚拟地址 然后应用程序将尝试以该地址作为参数 即作为 CPU 指令 进行读 写操作 执行读取命令时 内存管理单元会将该地址转换为物理地址 并查看页
  • 图标和导航视图之间的左边距

    我必须在图标和图标之间添加左边距NavigationView 如下图中箭头所示 我知道根据谷歌规范 这个边距必须有16dp但我需要改变它 我努力了
  • 在进行堆转储后,如何在发生 OutOfMemoryError 时重新启动 JVM?

    我知道关于 XX HeapDumpOnOutOfMemoryError https stackoverflow com q 542979 260805JVM 参数 我也知道 XX OnOutOfMemoryError cmd args cm
  • 尝试通过 Java 8 中的 JDBC-ODBC 连接到 .accdb 文件时出现 ClassNotFoundException

    我正在 Eclipse EE IDE 中的 Java 项目中工作 我必须在其中查询 accdb文件 问题是当我尝试加载驱动程序然后连接到数据库时 它给了我一个异常错误 My code try String filePath myfilepa
  • Java 9:AES-GCM 性能

    我进行了一个简单的测试来测量AES GCM https en wikipedia org wiki Galois Counter Mode表现在Java 9 通过在循环中加密字节缓冲区 结果有些令人困惑 本机 硬件 加速似乎有效 但并非总是
  • Java 执行器和长寿命线程

    我继承了一些使用 Executors newFixedThreadPool 4 的代码运行 4 个长寿命线程来完成应用程序的所有工作 这是推荐的吗 我读过Java 并发实践 https rads stackoverflow com amzn
  • Java环境变量设置方法

    我已将以下行插入 bash profile export GOOGLE APPLICATION CREDENTIALS Users jun Downloads export PATH PATH GOOGLE APPLICATION CRED
  • 隐藏 JTable 临时列

    我正在使用 JTable 显示数据库中的数据 现在我想通过 Jcombobox 过滤我的 jtable 我正在使用 Jcombo 框 其中包含 030 024 045 等值 这些值已在 jtable 中设置为列标题 当我单击组合时 选定的列
  • Zookeeper 未启动,nohup 错误

    我已经下载了zookeeper 3 4 5 tar gz 解压后我将conf zoo cfg写为 tickTime 2000 dataDir var zookeeper clientPort 2181 现在我尝试通过 bin zkServe
  • “mvn”不被识别为内部或外部命令、可操作程序或批处理文件

    可能是之前问过问题 但我发现了非常奇怪的错误 当我跑步时mvn versionbin 中的命令给出了版本和其他信息 但是 当我跑到垃圾箱外面时 它会出现异常 下面提到的结果 C Program Files apache maven 3 0
  • 如何在 tomcat 上部署 Java Web 应用程序 (.war)?

    我有一个 warJava Web 应用程序的文件 现在我想将它上传到我的 ftp 服务器 以便我可以执行它 我应该执行哪些步骤来运行它 webapp的上下文路径是 mywebapp Edit 实际上 我的 ftp 服务器名称是ftp bil
  • 为什么我们不能在函数式接口中重载抽象方法? (爪哇)

    所以我熟悉java中的函数式接口 以及它们与lambda表达式的使用 一个函数式接口只能包含一个抽象方法 当从 lambda 表达式使用这一孤独方法时 您不需要指定其名称 因为接口中只有一个抽象方法 编译器知道这就是您正在引用的方法 Exa
  • RetentionPolicy CLASS 与 RUNTIME

    两者之间有什么实际区别RetentionPolicy CLASS and RetentionPolicy RUNTIME 看起来两者都被记录到字节码中 并且无论如何都可以在运行时访问 无论如何 两者都可以在运行时访问 那不是那个javado

随机推荐