RESTEasy Mock 与异常映射器与上下文

2024-02-16

RESTEasy 模拟框架工作正常,没有异常映射器——接收请求并返回带有预期内容的实体。

注册异常映射器并强制异常后,当 RESTEasy 内部调用 ResteasyProviderFactory.getContextData(type) 时,调用失败,返回 null,导致意外错误消息:“无法找到类型为 javax.servlet.http.HttpServletRequest 的上下文数据” 。

在网上找不到 RESTEasy 模拟和异常映射器的任何示例,也找不到有关该错误的任何有用信息。

客户类别:

package com.foo;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "foo-type", propOrder = {
    "name"
})
@XmlRootElement(name = "foo")
public class Foo {

    protected String name;

    public String getName() {
        return name;
    }

    public void setName(String value) {
        this.name = value;
    }
}

对象工厂:

package com.foo;

import javax.xml.bind.annotation.XmlRegistry;

@XmlRegistry
public class ObjectFactory {

    public ObjectFactory() {
    }

    public Foo createFoo() {
        return new Foo();
    }
}

验证异常:

package com.foo;

public class ValidationException extends RuntimeException {

    private static final long serialVersionUID = -8100360206713223313L;

    public ValidationException(String message) {
        super(message);
    }

    public ValidationException(Exception innerException) {
        super(innerException);
    }

    public ValidationException(String message, Exception innerException) {
        super(message, innerException);
    }
}

服务端点:

package com.foo;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/rest/v1")
public class FooService {

    @GET
    @Path("/foo")
    @Produces("application/xml")
    public Foo alwaysBlowUp() throws ValidationException {
        if (System.currentTimeMillis() > 0) {
            throw new ValidationException("FOO");
        }
        return null;
    }
}

异常映射器:

package com.foo;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class FooExceptionMapper implements ExceptionMapper<ValidationException> {

    @Context
    private static HttpServletRequest request;
    @Context
    private static HttpHeaders headers;

    @Override
    public Response toResponse(ValidationException exception) {
        MediaType mediaType = null;

/*
Set breakpoint on line below.
Step over line and you get the exception in the logs.
Step into the line and the problem is in ResteasyProviderFactory:

public static <T> T getContextData(Class<T> type)
{
    return (T) getContextDataMap().get(type); <<< type == javax.servlet.http.HttpServletRequest
}

The type is not in the map, so it returns null.

The null results in this error in ContextParameterInjector:

private class GenericDelegatingProxy implements InvocationHandler
{
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable
    {
        try
        {
            Object delegate = ResteasyProviderFactory.getContextData(type);
            if (delegate == null)
               throw new LoggableFailure("Unable to find contextual data of type: " + type.getName()); <<< ERROR IN LOGS
*/

        String acceptHeader = request.getHeader("accept");

        if (MediaType.APPLICATION_XML.equals(acceptHeader)) {
            mediaType = MediaType.APPLICATION_XML_TYPE;
        } else if (MediaType.APPLICATION_JSON.equals(acceptHeader)) {
            mediaType = MediaType.APPLICATION_JSON_TYPE;
        } else {
            mediaType = headers.getMediaType();

            if (mediaType == null) {
                mediaType = MediaType.APPLICATION_XML_TYPE;
            }
        }

        ResponseBuilder builder = Response.status(Status.BAD_REQUEST);
        builder.type(mediaType);
        return builder.build();
    }
}

Test:

package com.foo;

import java.net.URISyntaxException;

import org.jboss.resteasy.core.Dispatcher;
import org.jboss.resteasy.mock.MockDispatcherFactory;
import org.jboss.resteasy.mock.MockHttpRequest;
import org.jboss.resteasy.mock.MockHttpResponse;
import org.jboss.resteasy.plugins.server.resourcefactory.POJOResourceFactory;

public final class TestFooExceptionMapper {

    public static void main(String[] args) throws URISyntaxException {
        Dispatcher dispatcher = MockDispatcherFactory.createDispatcher();
        dispatcher.getRegistry().addResourceFactory(new POJOResourceFactory(FooService.class));
        dispatcher.getProviderFactory().addExceptionMapper(FooExceptionMapper.class);

        MockHttpRequest request = MockHttpRequest.get("/rest/v1/foo");
        MockHttpResponse response = new MockHttpResponse();
        dispatcher.invoke(request, response);
    }
}

Error:

Aug 26, 2012 10:44:26 PM org.jboss.resteasy.core.SynchronousDispatcher 
SEVERE: Failed executing GET /rest/v1/foo
org.jboss.resteasy.spi.LoggableFailure: Unable to find contextual data of type: javax.servlet.http.HttpServletRequest
    at org.jboss.resteasy.core.ContextParameterInjector$GenericDelegatingProxy.invoke(ContextParameterInjector.java:56)
    at $Proxy18.getHeader(Unknown Source)
    at com.foo.FooExceptionMapper.toResponse(FooExceptionMapper.java:51)
    at com.foo.FooExceptionMapper.toResponse(FooExceptionMapper.java:1)
    at org.jboss.resteasy.core.SynchronousDispatcher.executeExceptionMapper(SynchronousDispatcher.java:330)
    at org.jboss.resteasy.core.SynchronousDispatcher.unwrapException(SynchronousDispatcher.java:359)
    at org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException(SynchronousDispatcher.java:348)
    at org.jboss.resteasy.core.SynchronousDispatcher.handleException(SynchronousDispatcher.java:220)
    at org.jboss.resteasy.core.SynchronousDispatcher.handleInvokerException(SynchronousDispatcher.java:196)
    at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:551)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:513)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:125)
    at com.foo.TestFooExceptionMapper.main(TestFooExceptionMapper.java:20)

问题是“模拟框架”不提供HttpServletRequest结合上下文。它与ExceptionMapper.

Resteasy注射剂@Context基于中存在的数据的字段ResteasyProviderFactory.getContextDataMap()。当此映射不包含以下实例时HttpServletRequest,它会因错误“无法找到类型的上下文数据...”而崩溃

我通过模拟解决了这个问题HttpServletRequest进入轻松的环境:

Dispatcher dispatcher = MockDispatcherFactory.createDispatcher();
dispatcher.getRegistry().addSingletonResource(new Service());

ResteasyProviderFactory
        .getContextDataMap()
        .put(HttpServletRequest.class, new MockHttpServletRequest());

MockHttpResponse response = new MockHttpResponse();

dispatcher.invoke(
    MockHttpRequest.get("/"),
    response
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RESTEasy Mock 与异常映射器与上下文 的相关文章

  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 如何在加载.NET WinForm应用程序user.config文件时捕获异常?

    有时 在使用默认配置系统的 NET 2 0 WinForm 桌面应用程序中 user config文件将被损坏并且无法再加载 当配置系统尝试加载它时 它会抛出一个System Xml XmlException 抛开 为什么文件首先被损坏 的
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 在 Ansible 中创建已安装软件包的报告

    我正在尝试制作一份包含几台机器上已安装的软件包及其版本的报告 该报告必须在执行 playbook 的计算机上创建 这是我当前的剧本 name main hosts all gather facts no become true tasks
  • Excel 中按轮廓级别(组)着色

    我想根据 Excel 中的大纲级别更改单元格的颜色 大纲级别是指列分组的级别 我正在尝试使用 ActiveCell OutlineLevel 属性在 ColorByValue 过滤器中使用 这可能吗 或者 有没有办法通过 VBA 或函数来做
  • Flex:包裹的物品与其他物品的宽度相同

    我使用 Flex 创建一个多列列表 该列表根据容器的宽度调整列数 我发现的问题是 如果我想通过将 flex grow 设置为 1 来使用父级的完整宽度 则最后一个换行行中的项目会未对齐 因为它们试图填充父级 我发现了两种对我不起作用的解决方
  • 如果屏幕尺寸小于指定值,则将水平块转换为垂直块

    在下面的代码中 我希望水平三列块放置并堆叠在彼此之上 以防容器的大小小于 X 像素 对于较小或移动设备 我应该如何以及在表的哪个元素上应用此属性 请注意 代码是一个内容块 因此我不想将 CSS 应用于整个电子邮件模板或电子邮件除非这是解决这
  • HKLM\Software 下的 OpenSubKey 返回 null

    这是我的代码 Microsoft Win32 RegistryKey key Microsoft Win32 Registry LocalMachine OpenSubKey SOFTWARE ADM 该注册表项存在于计算机上 键始终为空
  • ASP.NET Core上的静态文件

    我正在尝试启用静态文件ASP NET Core 2 0Web应用程序 我在一个名为 updater 的文件夹中有一堆文件 该文件夹位于wwwroot文件夹 为了允许访问它们 我添加了 app UseStaticFiles new Stati
  • 使用 numpy 将二进制掩码应用于 RGB 图像时出现问题

    我正在尝试使用 numpy 将二进制掩码应用于 RGB 图像 我找到了这个https stackoverflow com a 26843467 4628384 https stackoverflow com a 26843467 46283
  • Android NDK:从 C++ 调用 Java 函数

    我对 JNI 非常陌生 在将 C iOS 代码移植到 JNI 之前 我试图弄清楚某些事情是如何工作的 我成功地让 NDK 示例之一在 Android studio 中运行 我可以看到 Java 如何调用 C 函数 我一直在四处寻找并获取大量
  • 从 SQL 导出数据并写入文本文件(不能使用 CP 或 SP)

    因此 我正在寻找一种简单的方法来从 SQL Server 2000 数据库导出数据并将其写入逗号分隔的文本文件 它只有一张表 只有大约 1 000 行 我是 C 新手 所以如果这是一个愚蠢的问题 请原谅我 这是一项非常简单的任务 但您需要了
  • 如何在使用 XSL-FO 生成的 PDF 中插入换行符

    我正在使用 XSL FO 和 XML 生成 PDF 在文本框中 用户可以输入 1 等数据 然后按 ENTER 然后按 2 ENTER 3 等 但在 XML 和 PDF 中 输出是 1234567 如何保留换行符 我已经尝试过了white s
  • Vue props 数据未在子组件中更新

    大家好 我只是想要一些关于 vue props 数据的解释 所以我将值从父组件传递到子组件 问题是 当父数据发生数据更改 更新时 它不会在子组件中更新 Vue component child component template div c
  • Blazor JsInterop:调用 JS 时 Div 不可用

    该问题涉及客户端 Blazor 组件 该组件包含一个被组件变量隐藏的 div bool 打开 我需要组件在组件代码文件中显示 div 之后运行一些 Javascript 以便调整它在屏幕上的位置 下面的代码应该更好地解释这一点 组件 raz
  • 为什么要使用弹簧? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • NetworkStream 和 Socket 类有什么区别?

    我有一个项目 我可能想抽象客户端和服务器之间的通信 我最初使用的是套接字和 TCP 然后我认为能够切换到进程间通信通道可能会很好 然后我查看了 System IO PipedStream 类 发现 PipeStream 和 Socket 类
  • PowerShell Start-Service无限运行

    Problem 因此 我有一段代码用于启动服务 如果服务花费太长时间并且在大多数情况下工作正常 则服务超时 不幸的是 当该服务尝试启动无法启动的服务时 它会显示以下警告消息 WARNING Waiting for ServiceName
  • 从数组中删除重复的字符串?

    如何在不使用 HashSet 的情况下从字符串数组中删除重复的字符串 我尝试使用循环 但没有删除的话 StringBuffer outString new StringBuffer Our aim and isn t easy you yo
  • 创建 OpenLayer 圈时出现问题

    如何在openlayer地图中画一个圆 我尝试过不同的方式 但它不起作用 请帮助我编写代码 我使用了以下代码 但它创建了多边形 var p1 new OpenLayers Geometry Point 439000 114000 var p
  • 我可以在我的视图模型中创建一个实时数据观察器吗?或者我应该始终观察片段/活动?

    我是 MVVM 新手 因此 我的片段 活动向服务器发出了 2 个请求 第一个请求的结果将用作第二个请求的输入参数 因此 首先在我的片段中 当单击按钮时 我会发出请求以检查用户是否被禁止 如果没有 则该用户可以创建帖子 所以首先我检查用户是否
  • 检测两年以上的浏览器

    这是一个拥有大约 10 000 个用户的私人公司网站 我已经看到了一些浏览器检测的努力 但与浏览器的年龄无关 有人对此有想法吗 相关项目 http fresh browsers com en http fresh browsers com
  • RESTEasy Mock 与异常映射器与上下文

    RESTEasy 模拟框架工作正常 没有异常映射器 接收请求并返回带有预期内容的实体 注册异常映射器并强制异常后 当 RESTEasy 内部调用 ResteasyProviderFactory getContextData type 时 调